本文以作者實(shí)際工作的中文和英文語句語法檢查工具為例,說明正則表達(dá)式的用法。
#encoding:utf-8
'''
Created on 2016年5月11日
'''
import chardet
import sys
import re
#中文編碼字符串
chinese_code=u'\u4E00-\u9FA5'
fullwidth_num=u'\uFF10-\uFF19'
fullwidth_char=u'\uff21-\uff3a\uff41-\uff5a'
fullwidth_black=u'\u3000'
fullwidth_common_symbol=u'\uff01-\uff0f\uff1a-\uff20\uff3b-\uff40\uff5b-\uff5e\uFF5F-\uFF65\uFF9E-\uFF9F'
halfwidth_num=u'\u0030-\u0039'
halfwidth_char=u'\u0041-\u005a\u0061-\u007a'
halfwidth_black=u'\u0020'
halfwidth_symbol=u'\u0021-\u002f\u003a-\u0040\u005b-\u0060\u007b-\u007e'
english_code=halfwidth_num+halfwidth_char+halfwidth_black+halfwidth_symbol
english_code_withoutblack=halfwidth_num+halfwidth_char+halfwidth_symbol
fullwidth_period=u'\u3002'#中文句號(hào)
fullwidth_double_quote_front=u'\u201c'#“
fullwidth_double_quote_end=u'\u201d'#”
fullwidth_single_quote_front=u'\u2018'#‘
fullwidth_single_quote_end=u'\u2019'#’
fullwidth_comma=u'\uff0c'#,
fullwidth_slight_pause=u'\u3001'#、
fullwidth_round_bracket_left=u'\uff08'#圓括號(hào)左半部(
fullwidth_round_bracket_right=u'\uff09'#圓括號(hào)右半部)
fullwidth_book_left=u'\u300a'#書名號(hào)左半部《
fullwidth_book_right=u'\u300b'#書名號(hào)右半部》
fullwidth_colon=u'\uff1a'#中文冒號(hào):
fullwidth_dash=u'\u2014\u2014'#中文破折號(hào)——
fullwidth_percent=u'\uff05'#中文百分號(hào)%
halfwidth_dash=u'\u002d'#-
halfwidth_percent=u'\u0025'#百分號(hào)%
check_stauts_ok_str="ok"
check_stauts_fail_str="fail"
check_stauts_manual_str="manual"
def record_log(aLog):
f=open('web;,'ab')
f.write(aLog)
f.close()
#需要人工檢查的標(biāo)點(diǎn)符號(hào)
special_sysmbol=fullwidth_period+fullwidth_double_quote_front+ \
fullwidth_double_quote_end+fullwidth_single_quote_front+ \
fullwidth_single_quote_end+fullwidth_comma+ \
fullwidth_slight_pause+fullwidth_round_bracket_left+ \
fullwidth_round_bracket_right+fullwidth_book_left+ \
fullwidth_book_right+fullwidth_colon+fullwidth_dash+ \
halfwidth_dash+fullwidth_percent+halfwidth_percent
#所有已知的標(biāo)點(diǎn)符號(hào)(包括全角、半角)
all_symbol=fullwidth_common_symbol+ \
halfwidth_symbol+ \
special_sysmbol
#所有全角標(biāo)點(diǎn)符號(hào)(不包括空格)
fullwidth_symbol_all=fullwidth_common_symbol+fullwidth_period+fullwidth_double_quote_front+ \
fullwidth_double_quote_end+fullwidth_single_quote_front+ \
fullwidth_single_quote_end+fullwidth_comma+fullwidth_slight_pause+ \
fullwidth_round_bracket_left+fullwidth_round_bracket_right+ \
fullwidth_book_left+fullwidth_book_right+fullwidth_colon+ \
fullwidth_dash+fullwidth_percent
#中/英文語句:無全角英文、無全角數(shù)字、全角空格
def rule_one(aUnicodeStr):
pat1=re.compile('[%s%s%s]'%(fullwidth_num,fullwidth_char,fullwidth_black))
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
if mat1:
res_status='fail'
res_message=u'規(guī)則1-中英文語句:不能含有全角英文、全角數(shù)字、全角空格\n出錯(cuò)范圍:%s'%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#英文語句:不含有全角標(biāo)點(diǎn)符號(hào)、全角空格、全角數(shù)字
def rule_four(aUnicodeStr):
pat1=re.compile('[%s]+'%fullwidth_symbol_all)
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
if mat1:
res_status=check_stauts_fail_str
res_message=u"規(guī)則4-英文語句:不能含有非ascii碼字符\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:結(jié)尾必須是全角標(biāo)點(diǎn)符號(hào)或無標(biāo)點(diǎn)
def rule_five(aUnicodeStr):
#pat1=re.compile('[%s]*$'%fullwidth_symbol_all)
pat1=re.compile('[%s]+$'%(halfwidth_symbol))
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
#mat2=(aUnicodeStr)
if mat1 :
res_status=check_stauts_fail_str
res_message=u"規(guī)則5-中文語句:結(jié)尾必須是全角標(biāo)點(diǎn)符號(hào)或無標(biāo)點(diǎn)符號(hào)\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:英文字母、數(shù)字之間如果有標(biāo)點(diǎn)符號(hào),必須為半角
def rule_six(aUnicodeStr):
pat1=re.compile('[%s]{1}[%s]+[%s]{1}'%(halfwidth_num+halfwidth_char,
fullwidth_symbol_all,halfwidth_num+halfwidth_char))
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
if mat1:
res_status=check_stauts_fail_str
res_message=u"規(guī)則6-中文語句:英文字母、數(shù)字之間如果有標(biāo)點(diǎn)符號(hào),必須為半角\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:中文前后標(biāo)點(diǎn)符號(hào),必須為全角
def rule_seven(aUnicodeStr):
pat1=re.compile('[%s]+[%s]+'%(chinese_code,halfwidth_symbol))
pat2=re.compile('[%s]+[%s]+'%(halfwidth_symbol,chinese_code))
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
mat2=(aUnicodeStr)
if mat1 or mat2:
res_status=check_stauts_fail_str
if mat1:
res_message=u"規(guī)則7-中文語句:中文前后標(biāo)點(diǎn)符號(hào),必須為全角\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
else:
res_message=u"規(guī)則7-中文語句:中文前后標(biāo)點(diǎn)符號(hào),必須為全角\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
#return (res_status,res_message)
return (check_stauts_ok_str,'')
#中文語句:全角雙引號(hào)(“”)中可出現(xiàn)單引號(hào),反之不可以
def rule_eight(aUnicodeStr):
pat1=re.compile(u'[‘]+[^“”‘’]*[“]+[^“”‘’]*[”]+[^“”‘’]*[’]+')
pat2=re.compile(u'[‘]+[^“”‘’]*[“]+[^“”‘’]*[‘]+[^“”‘’]*[”]+')
pat3=re.compile(u'[‘]+[^“”‘’]*[“]+[^“”‘’]*[”]+[^“”‘’]*[’]+')
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
mat2=(aUnicodeStr)
mat3=(aUnicodeStr)
if mat1 or mat2 or mat3 :
res_status=check_stauts_fail_str
if mat1:
res_message=u"規(guī)則8-中文語句:全角雙引號(hào)(“”)中可出現(xiàn)單引號(hào)‘’,反之不可以\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
elif mat2:
res_message=u"規(guī)則8-中文語句:全角雙引號(hào)(“”)中可出現(xiàn)單引號(hào)‘’,反之不可以\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
else :
res_message=u"規(guī)則8-中文語句:全角雙引號(hào)(“”)中可出現(xiàn)單引號(hào)‘’,反之不可以\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:全角雙引號(hào)內(nèi)不允許含有全角分號(hào)、冒號(hào)
def rule_nine(aUnicodeStr):
pat1=re.compile(u'[“]+[^“”]*[:]+[”]')
pat2=re.compile(u'[“]+[^“”]*[;]+[”]')
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
mat2=(aUnicodeStr)
if mat1 or mat2:
res_status=check_stauts_fail_str
if mat1:
res_message=u"規(guī)則9-中文語句:全角雙引號(hào)內(nèi)不允許含有全角分號(hào)、冒號(hào)\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
else:
res_message=u"規(guī)則9-中文語句:全角雙引號(hào)內(nèi)不允許含有全角分號(hào)、冒號(hào)\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:括號(hào)內(nèi)包含純中文或同時(shí)包含中文及英文和數(shù)字時(shí),使用全角括號(hào),括號(hào)前后不加空格。
def rule_ten(aUnicodeStr):
pat1=re.compile(u'([ ]+')
pat2=re.compile(u'[ ]+(')
pat3=re.compile(u')[ ]+')
pat4=re.compile(u'[ ]+)')
pat5=re.compile(u'[(]{1}[a-zA-Z0-9]*[^%s%s]+[a-zA-Z0-9]*[)]{1}'%(chinese_code,fullwidth_symbol_all))
#pat5=re.compile(u'[(]{1}[a-zA-Z0-9]*[%s%s]+[a-zA-Z0-9]*[)]{1}'%(chinese_code,fullwidth_symbol_all))
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
mat2=(aUnicodeStr)
mat3=(aUnicodeStr)
mat4=(aUnicodeStr)
mat5=(aUnicodeStr)
if mat1 or mat2 or \
mat3 or mat4 or \
mat5:
res_status=check_stauts_fail_str
if mat1:
res_message=u"規(guī)則10-中文語句:括號(hào)內(nèi)包含純中文或同時(shí)包含中文及英文和數(shù)字時(shí),使用全角括號(hào),括號(hào)前后不加空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
elif mat2:
res_message=u"規(guī)則10-中文語句:括號(hào)內(nèi)包含純中文或同時(shí)包含中文及英文和數(shù)字時(shí),使用全角括號(hào),括號(hào)前后不加空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
elif mat3:
res_message=u"規(guī)則10-中文語句:括號(hào)內(nèi)包含純中文或同時(shí)包含中文及英文和數(shù)字時(shí),使用全角括號(hào),括號(hào)前后不加空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
elif mat4:
res_message=u"規(guī)則10-中文語句:括號(hào)內(nèi)包含純中文或同時(shí)包含中文及英文和數(shù)字時(shí),使用全角括號(hào),括號(hào)前后不加空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
else :
res_message=u"規(guī)則10-中文語句:括號(hào)內(nèi)包含純中文或同時(shí)包含中文及英文和數(shù)字時(shí),使用全角括號(hào),括號(hào)前后不加空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:括號(hào)內(nèi)的內(nèi)容為純英文、純數(shù)字或純半角英文符號(hào)時(shí),使用半角括號(hào),括號(hào)前后加半角空格。
def rule_eleven(aUnicodeStr):
#pat1=re.compile(u'[(]{1}[^\u0020]+')
pat2=re.compile(u'[^\u0020]+[(]{1}')
pat3=re.compile(u'[)]{1}[^\u0020]+')
#pat4=re.compile(u'[^\u0020]+[)]{1}')
pat5=re.compile(u'[\u0020]{1}[(]{1}[\u0020]{1}[%s]*[%s]+[%s]*[\u0020]{1}[)]{1}[\u0020]{1}'%(
english_code_withoutblack,
chinese_code+fullwidth_symbol_all,
english_code_withoutblack))
pat6=re.compile(u'^[(]')
pat7=re.compile(u'[)]{1}$')
res_status=check_stauts_ok_str
res_message=''
#mat1=(aUnicodeStr)
mat2=(aUnicodeStr)
mat3=(aUnicodeStr)
#mat4=(aUnicodeStr)
mat5=(aUnicodeStr)
mat6=(aUnicodeStr)
mat7=(aUnicodeStr)
if mat2 or \
mat3 or \
mat5 or mat6 or \
mat7 :
res_status=check_stauts_fail_str
#if mat1:
# res_message=u"規(guī)則11-中文語句:括號(hào)內(nèi)的內(nèi)容為純英文、純數(shù)字或純半角英文符號(hào)時(shí),使用半角括號(hào),括號(hào)前后加半角空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
if mat2:
res_message=u"規(guī)則11-中文語句:括號(hào)內(nèi)的內(nèi)容為純英文、純數(shù)字或純半角英文符號(hào)時(shí),使用半角括號(hào),括號(hào)前后加半角空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
elif mat3:
res_message=u"規(guī)則11-中文語句:括號(hào)內(nèi)的內(nèi)容為純英文、純數(shù)字或純半角英文符號(hào)時(shí),使用半角括號(hào),括號(hào)前后加半角空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
#elif mat4:
# res_message=u"規(guī)則11-中文語句:括號(hào)內(nèi)的內(nèi)容為純英文、純數(shù)字或純半角英文符號(hào)時(shí),使用半角括號(hào),括號(hào)前后加半角空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
elif mat5:
res_message=u"規(guī)則11-中文語句:括號(hào)內(nèi)的內(nèi)容為純英文、純數(shù)字或純半角英文符號(hào)時(shí),使用半角括號(hào),括號(hào)前后加半角空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
elif mat6:
res_message=u"規(guī)則11-中文語句:括號(hào)內(nèi)的內(nèi)容為純英文、純數(shù)字或純半角英文符號(hào)時(shí),使用半角括號(hào),括號(hào)前后加半角空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
else:
res_message=u"規(guī)則11-中文語句:括號(hào)內(nèi)的內(nèi)容為純英文、純數(shù)字或純半角英文符號(hào)時(shí),使用半角括號(hào),括號(hào)前后加半角空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:全角中文字符與半角英文字符和半角阿拉伯?dāng)?shù)字之間應(yīng)有一個(gè)半角空格
def rule_twelve(aUnicodeStr):
pat1=re.compile(u'[a-zA-Z0-9]+[%s]+'%chinese_code)
pat2=re.compile(u'[%s]+[a-zA-Z0-9]+'%chinese_code)
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
mat2=(aUnicodeStr)
if mat1 or mat2 :
res_status=check_stauts_fail_str
if mat1:
res_message=u"規(guī)則12-中文語句:全角中文字符與半角英文字符和半角阿拉伯?dāng)?shù)字之間應(yīng)有一個(gè)半角空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
else:
res_message=u"規(guī)則12-中文語句:全角中文字符與半角英文字符和半角阿拉伯?dāng)?shù)字之間應(yīng)有一個(gè)半角空格\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:全角標(biāo)點(diǎn)符號(hào)與前后字符之間均不留空。
def rule_thirteen(aUnicodeStr):
pat1=re.compile(u'[%s]+[\u0020]+'%fullwidth_symbol_all)
pat2=re.compile(u'[\u0020]+[%s]+'%fullwidth_symbol_all)
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
mat2=(aUnicodeStr)
if mat1 or mat2 :
res_status=check_stauts_fail_str
if mat1:
res_message=u"規(guī)則13-中文語句:全角標(biāo)點(diǎn)符號(hào)與前后字符之間均不留空。\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
else:
res_message=u"規(guī)則13-中文語句:全角標(biāo)點(diǎn)符號(hào)與前后字符之間均不留空。\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:中文之間無空格
def rule_fourteen(aUnicodeStr):
pat1=re.compile(u'[%s]+[\u0020]+[%s]'%(chinese_code,chinese_code))
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
if mat1:
res_status=check_stauts_fail_str
res_message=u"規(guī)則14-中文語句:全角標(biāo)點(diǎn)符號(hào)與前后字符之間均不留空。\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
'''
中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序:
全角:()、“”、‘’,《》,{},【】
半角:()、{},[]
'''
def rule_fifteen(aUnicodeStr):
res_status=check_stauts_ok_str
res_message=''
symbol_count_map={u'(':0,u')':0,u'“':0,u'”':0,u'‘':0,u'’':0,u'《':0,u'》':0,
u'{':0,u'}':0,u'【':0,u'】':0,u'(':0,u')':0,u'{':0,u'}':0,
u'[':0,u']':0}
symbol_pos_map={u'(':[],u')':[],u'“':[],u'”':[],u'‘':[],u'’':[],u'《':[],u'》':[],
u'{':[],u'}':[],u'【':[],u'】':[],u'(':[],u')':[],u'{':[],u'}':[],
u'[':[],u']':[]}
symbol_pair_map={u'(':u')',u'“':u'”',u'‘':u'’',u'《':u'》',
u'{':u'}',u'【':u'】',u'(':u')',u'{':u'}',
u'[':u']'}
#獲取字符的個(gè)數(shù)
for (kT,vT) in ():
symbol_count_map[kT]=aUnicodeS(kT)
#獲取字符位置
for (kT,vT) in ():
if vT==0:
continue
else:
for i in range(1,vT+1):
symbol_pos_map[kT].append(get_substr_pos(aUnicodeStr,kT,i))
#檢查是否成對(duì)出現(xiàn),且前后順序正確
for (kT,vT) in ():
if symbol_count_map[kT] != symbol_count_map[vT]:
res_status=check_stauts_fail_str
res_message=u"規(guī)則15-中英文語句:()、“”、‘’,《》,{},【】 ()、{},[]必須成對(duì)出現(xiàn),且有先后順序"
elif symbol_count_map[kT] != 0:
for i in range(0,symbol_count_map[kT]):
if symbol_pos_map[kT][i]>=symbol_pos_map[vT][i]:
res_status=check_stauts_fail_str
res_message=u"規(guī)則15-中英文語句:()、“”、‘’,《》,{},【】 ()、{},[]必須成對(duì)出現(xiàn),且有先后順序"
break
if res_status == check_stauts_fail_str:
break
return (res_status,res_message)
#中文語句:中文后面的標(biāo)點(diǎn)符號(hào)應(yīng)為全角標(biāo)點(diǎn)符號(hào)
def rule_sixteen(aUnicodeStr):
pat1=re.compile(u'[%s]+[%s]+'%(chinese_code,halfwidth_symbol))
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
if mat1:
res_status=check_stauts_fail_str
res_message=u"規(guī)則16-中文語句:中文后面的標(biāo)點(diǎn)符號(hào)應(yīng)為全角標(biāo)點(diǎn)符號(hào)。\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:開頭和結(jié)尾不能是半角、全角空格
def rule_seventeen(aUnicodeStr):
pat1=re.compile(u'^ +')
pat2=re.compile(u' +$')
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
mat2=(aUnicodeStr)
if mat1 or mat2:
res_status=check_stauts_fail_str
if mat1:
res_message=u"規(guī)則17-中文語句:開頭和結(jié)尾不能是半角、全角空格。\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
else:
res_message=u"規(guī)則17-中文語句:開頭和結(jié)尾不能是半角、全角空格。\n出錯(cuò)范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:括號(hào)中的內(nèi)容為獨(dú)立的語句時(shí),句號(hào)應(yīng)包含在括號(hào)內(nèi)
def rule_eightteen(aUnicodeStr):
pat1=re.compile(u'(+.*。+.*)+')
pat2=re.compile(u'(+.*)+.*。+')
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
mat2=(aUnicodeStr)
if mat1 or mat2:
res_status=check_stauts_manual_str
if mat1:
res_message=u"規(guī)則18-中文語句:括號(hào)中的內(nèi)容為獨(dú)立的語句時(shí),句號(hào)應(yīng)包含在括號(hào)內(nèi)。請(qǐng)人工檢查\n檢查范圍:%s"%("("+str()[0])+','+str()[1])+")")
else :
res_message=u"規(guī)則18-中文語句:括號(hào)中的內(nèi)容為獨(dú)立的語句時(shí),句號(hào)應(yīng)包含在括號(hào)內(nèi)。請(qǐng)人工檢查\n檢查范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
#中文語句:19.20.22.23.24.25.26.27.28.30.33
def rule_nineteen(aUnicodeStr):
symbol_manual_map={u'“': u"規(guī)則19-引用說話的語句或?qū)μ囟ㄔ~句進(jìn)行強(qiáng)調(diào)時(shí)使用全角雙引號(hào)(“”),注意前后雙引號(hào)不同,請(qǐng)手工檢查",
u'‘': u"規(guī)則20-雙重引用時(shí)使用全角單引號(hào)(‘’),注意前后單引號(hào)不同,請(qǐng)手工檢查",
u',': u"規(guī)則22-中文語句中的停頓應(yīng)用全角逗號(hào)(,),請(qǐng)手工檢查",
u'、': u"規(guī)則23-中文語句中的并列詞間和中文語句中的英文并列詞間均應(yīng)該用全角頓號(hào)(、)分隔,而不用逗號(hào)。,請(qǐng)手工檢查",
u'(': u"規(guī)則24-對(duì)于前一語句改換說法,或作補(bǔ)充說明時(shí),使用圓括號(hào)。圓括號(hào)包括全角()和半角 () 兩種形式,請(qǐng)手工檢查",
u'(': u"規(guī)則24-對(duì)于前一語句改換說法,或作補(bǔ)充說明時(shí),使用圓括號(hào)。圓括號(hào)包括全角()和半角 () 兩種形式,請(qǐng)手工檢查",
u':': u"規(guī)則25-列舉項(xiàng)目時(shí),使用全角冒號(hào)。2. 表示時(shí)間的 (:) 應(yīng)使用半角冒號(hào)。,請(qǐng)手工檢查",
u':': u"規(guī)則25-列舉項(xiàng)目時(shí),使用全角冒號(hào)。2. 表示時(shí)間的 (:) 應(yīng)使用半角冒號(hào)。,請(qǐng)手工檢查",
u'——':u"規(guī)則26-做補(bǔ)充說明或話題轉(zhuǎn)換時(shí)使用中文全角破折號(hào)(——) ,請(qǐng)手工檢查",
u'-': u"規(guī)則26- 當(dāng)表示數(shù)值間的范圍(例如日期、時(shí)間或數(shù)字),或當(dāng)表示兩個(gè)名詞的復(fù)合,或表示圖序、表序的標(biāo)號(hào)時(shí),使用英文半角連字符 (-) ,請(qǐng)手工檢查",
u'《': u"規(guī)則27-書名、節(jié)目名、法律法規(guī)名等需要所以書名號(hào)(《》)進(jìn)行標(biāo)注,請(qǐng)手工檢查 ",
u'%': u"規(guī)則28-針對(duì)占位符,如果占位符代替的是數(shù)字,則前后視情況加空格,如果代替的是中文,則無需空格,請(qǐng)手工檢查 ",
u'%': u"規(guī)則28-針對(duì)占位符,如果占位符代替的是數(shù)字,則前后視情況加空格,如果代替的是中文,則無需空格 ,請(qǐng)手工檢查",
u'月': u"規(guī)則30-針對(duì)日期,只有在日歷里顯示日期的時(shí)候不加空格,比如:2016年5月6日;在其他地方,比如設(shè)置里顯示“開始于 1 月 1 日”的時(shí)候需要空格,請(qǐng)手工檢查 ",
u'年': u"規(guī)則30-針對(duì)日期,只有在日歷里顯示日期的時(shí)候不加空格,比如:2016年5月6日;在其他地方,比如設(shè)置里顯示“開始于 1 月 1 日”的時(shí)候需要空格,請(qǐng)手工檢查",
u'日': u"規(guī)則30-針對(duì)日期,只有在日歷里顯示日期的時(shí)候不加空格,比如:2016年5月6日;在其他地方,比如設(shè)置里顯示“開始于 1 月 1 日”的時(shí)候需要空格,請(qǐng)手工檢查",
u'.': u"規(guī)則33-如果需要沿用原文中的外文縮寫、外國人姓和名縮寫、注冊(cè)商標(biāo)、產(chǎn)品名、公司名及國名的縮寫,則用半角英文句點(diǎn) (.) 來表示該縮寫。3. 半角句點(diǎn) (.) 也可用作數(shù)字中的小數(shù)點(diǎn)或文件名中的分隔符,請(qǐng)手工檢查 ",
}
res_status=check_stauts_ok_str
res_message=''
for (kT,vT) in ():
pat1=re.compile('[%s]+'%kT)
if (aUnicodeStr):
res_status=check_stauts_manual_str
res_message=vT
break
return (res_status,res_message)
'''
引號(hào):3. 除非引用的內(nèi)容與標(biāo)點(diǎn)符號(hào)相對(duì)獨(dú)立,否則句號(hào)(。)、逗號(hào)(,)、問號(hào)(?)、感嘆號(hào)(!)應(yīng)保留在雙引號(hào)內(nèi),
并采用全角輸入。
'''
def rule_twentyone(aUnicodeStr):
pat1=re.compile(u'“+[^”]*[。,?!.\,\?\!]+')
pat2=re.compile(u'”+[。,?!.\,\?\!]+')
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
mat2=(aUnicodeStr)
if mat1 or mat2:
res_status=check_stauts_manual_str
if mat1:
res_message=u"規(guī)則21-中文語句:除非引用的內(nèi)容與標(biāo)點(diǎn)符號(hào)相對(duì)獨(dú)立,否則句號(hào)(。)、逗號(hào)(,)、問號(hào)(?)、感嘆號(hào)(!)應(yīng)保留在雙引號(hào)內(nèi),并采用全角輸入\n檢查范圍:%s"%("("+str()[0])+','+str()[1])+")")
else :
res_message=u"規(guī)則21-中文語句:除非引用的內(nèi)容與標(biāo)點(diǎn)符號(hào)相對(duì)獨(dú)立,否則句號(hào)(。)、逗號(hào)(,)、問號(hào)(?)、感嘆號(hào)(?。?yīng)保留在雙引號(hào)內(nèi),并采用全角輸入\n檢查范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
'''
數(shù)字與英文單位間加一個(gè)半角空格
'''
def rule_twentynine(aUnicodeStr):
pat1=re.compile(u'[0-9]+[ ]*[a-zA-Z]+')
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
if mat1:
res_status=check_stauts_manual_str
res_message=u"規(guī)則29-數(shù)字與英文單位間加一個(gè)半角空格\n檢查范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
'''
標(biāo)點(diǎn)符號(hào)連續(xù)出現(xiàn)
'''
def rule_thirtyone(aUnicodeStr):
pat1=re.compile(u'[\!\%\(\)\{\}\[\]\;\:\'\"\?\,\.。!\%()\{\}【】;:’“”’?,。、《》]{2,}')
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
if mat1:
res_status=check_stauts_manual_str
res_message=u"規(guī)則31-標(biāo)點(diǎn)符號(hào)連續(xù)出現(xiàn)\n檢查范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
'''
中文語句:英文字母、數(shù)字后面如果是標(biāo)點(diǎn)符號(hào),則應(yīng)該是半角
'''
def rule_thirtytwo(aUnicodeStr):
pat1=re.compile(u'[a-zA-Z0-9]+[\!\%\(\)\{\}\[\]\;\:\'\"\?\,\.。!\%()\{\}【】;:’“”’?,。、《》]+')
res_status=check_stauts_ok_str
res_message=''
mat1=(aUnicodeStr)
if mat1:
res_status=check_stauts_manual_str
res_message=u"規(guī)則32-英文字母、數(shù)字后面如果是標(biāo)點(diǎn)符號(hào),則應(yīng)該是半角\n檢查范圍:%s"%("("+str()[0])+','+str()[1])+")")
return (res_status,res_message)
def get_substr_pos(aString, subStr, findCnt):
listStr = aS(subStr,findCnt)
if len(listStr) <= findCnt:
return -1
return len(aString)-len(listStr[-1])-len(subStr)
#中文語句是:含有至少一個(gè)中文(數(shù)字、標(biāo)點(diǎn)符號(hào)不作為判斷依據(jù))
def check_iseng(aUnicodeStr):
pat1=re.compile(u'[%s]'%chinese_code)
res=True
if (aUnicodeStr):
res=False
return res
def get_unicode_str(aOriginStr):
u_string=u''
if isinstance(aOriginStr, str):
print "ordinary string"
record_log("ordinary string")
u_string = unicode(aOriginStr, c(aOriginStr)["encoding"])
elif isinstance(aOriginStr, unicode):
print "unicode string"
record_log("unicode string")
u_string=aOriginStr
else:
print "ERROR:not a string"
record_log("ERROR:not a string"+type(aOriginStr))
print type(aOriginStr)
return u_string
def rule_check_sentence(aOriginStr):
res_status=check_stauts_ok_str
res_message=''
uni_str=get_unicode_str(aOriginStr)
for i in range (0,1):
#規(guī)則1:中/英文語句:無全角英文、無全角數(shù)字、無全角空格
(res_status,res_message)=rule_one(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則17:中英文語句:開頭和結(jié)尾不能是半角、全角空格
(res_status,res_message)=rule_seventeen(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則15:中英文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_fifteen(uni_str)
if res_status!=check_stauts_ok_str:
break
if check_iseng(uni_str):#英文語句
#規(guī)則4:英文語句:不含有全角標(biāo)點(diǎn)符號(hào)、全角空格、全角數(shù)字
(res_status,res_message)=rule_four(uni_str)
if res_status!=check_stauts_ok_str:
break
else:
#規(guī)則5:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_five(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則6:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_six(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則7:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_seven(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則8:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_eight(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則9:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_nine(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則10:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_ten(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則11:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_eleven(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則12:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_twelve(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則13:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_thirteen(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則14:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_fourteen(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則16:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_sixteen(uni_str)
if res_status!=check_stauts_ok_str:
break
#檢查是否需要人工干預(yù)
#規(guī)則18:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_eightteen(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則19:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_nineteen(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則21:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_twentyone(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則29:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_twentynine(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則31:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_thirtyone(uni_str)
if res_status!=check_stauts_ok_str:
break
#規(guī)則32:中文語句:以下標(biāo)點(diǎn)符號(hào)成對(duì)出現(xiàn),且有先后順序
(res_status,res_message)=rule_thirtytwo(uni_str)
if res_status!=check_stauts_ok_str:
break
return (res_status,res_message)
def rule_check_buffer(aBuffer):
res_map={'ok':u'檢查正確語句列表:\n','manual':u'需要人工檢查語句列表:\n\n','fail':u'檢查錯(cuò)誤語句列表:\n\n'}
str_array=aBu('\n')
for i in range(0,len(str_array)):
uncheck_str=str_array[i].strip('\r\n')
#print uncheck_str
res_status=check_stauts_ok_str
res_message=''
(res_status,res_message)=rule_check_sentence(uncheck_str)
if res_status==check_stauts_ok_str:
res_map['ok']+=(u"語句:"+uncheck_str+'\n')
elif res_status==check_stauts_fail_str:
res_map['fail']+=(u"語句:"+uncheck_str+'\n'+u'出錯(cuò)原因:'+res_message+'\n\n')
elif res_status==check_stauts_manual_str:
res_map['manual']+=(u"語句:"+uncheck_str+'\n'+u'待查原因:'+res_message+'\n\n')
else:
print "ERROR:can not check the sentence:%s"%uncheck_str
return res_map
if __name__ == '__main__':
print "This script is not for call directly。the following code is only for testing"
print rule_eleven(u"請(qǐng)停止(4k) 錄像。")[0]
print rule_eleven(u"請(qǐng)停止(4k) 錄像。")[1]
1.《Python中的正則表達(dá)式探究(二)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。
2.《Python中的正則表達(dá)式探究(二)》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/caijing/2028130.html