网易首页 > 网易号 > 正文 申请入驻

python常用正则表达式 python中正则表达式是什么

0
分享至

本文以作者实际工作写的中、英文语句语法检查工具为例来介绍正则表达式的用法。

#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'#中文句号

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'#圆括号左半部(


fullwidth_round_bracket_right=u'\uff09'#圆括号右半部)

fullwidth_book_left=u'\u300a'#书名号左半部《

fullwidth_book_right=u'\u300b'#书名号右半部》

fullwidth_colon=u'\uff1a'#中文冒号:

fullwidth_dash=u'\u2014\u2014'#中文破折号——

fullwidth_percent=u'\uff05'#中文百分号%

halfwidth_dash=u'\u002d'#-

halfwidth_percent=u'\u0025'#百分号%

check_stauts_ok_str="ok"

check_stauts_fail_str="fail"

check_stauts_manual_str="manual"

def record_log(aLog):

f=open('website.txt','ab')

f.write(aLog)

f.close()

#需要人工检查的标点符号

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

#所有已知的标点符号(包括全角、半角)

all_symbol=fullwidth_common_symbol+ \

halfwidth_symbol+ \

special_sysmbol

#所有全角标点符号(不包括空格)

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

#中/英文语句:无全角英文、无全角数字、全角空格

def rule_one(aUnicodeStr):

pat1=re.compile('[%s%s%s]'%(fullwidth_num,fullwidth_char,fullwidth_black))

#print pat1.pattern

res_status=check_stauts_ok_str

res_message=''

mat1=pat1.search(aUnicodeStr)

if mat1:

res_status='fail'

res_message=u'规则1-中英文语句:不能含有全角英文、全角数字、全角空格\n出错范围:%s'%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

return (res_status,res_message)

#英文语句:不含有全角标点符号、全角空格、全角数字

def rule_four(aUnicodeStr):

pat1=re.compile('[%s]+'%fullwidth_symbol_all)

res_status=check_stauts_ok_str

res_message=''

mat1=pat1.search(aUnicodeStr)

if mat1:

res_status=check_stauts_fail_str

res_message=u"规则4-英文语句:不能含有非ascii码字符\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

return (res_status,res_message)

#中文语句:结尾必须是全角标点符号或无标点

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=pat1.search(aUnicodeStr)

#mat2=pat2.search(aUnicodeStr)

if mat1 :

res_status=check_stauts_fail_str

res_message=u"规则5-中文语句:结尾必须是全角标点符号或无标点符号\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

return (res_status,res_message)

#中文语句:英文字母、数字之间如果有标点符号,必须为半角

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=pat1.search(aUnicodeStr)

if mat1:

res_status=check_stauts_fail_str

res_message=u"规则6-中文语句:英文字母、数字之间如果有标点符号,必须为半角\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

return (res_status,res_message)

#中文语句:中文前后标点符号,必须为全角

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=pat1.search(aUnicodeStr)

mat2=pat2.search(aUnicodeStr)

if mat1 or mat2:

res_status=check_stauts_fail_str

if mat1:

res_message=u"规则7-中文语句:中文前后标点符号,必须为全角\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

else:

res_message=u"规则7-中文语句:中文前后标点符号,必须为全角\n出错范围:%s"%("("+str(mat2.span()[0])+','+str(mat2.span()[1])+")")

#return (res_status,res_message)

return (check_stauts_ok_str,'')

#中文语句:全角双引号(“”)中可出现单引号,反之不可以

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=pat1.search(aUnicodeStr)

mat2=pat2.search(aUnicodeStr)

mat3=pat3.search(aUnicodeStr)

if mat1 or mat2 or mat3 :

res_status=check_stauts_fail_str

if mat1:

res_message=u"规则8-中文语句:全角双引号(“”)中可出现单引号‘’,反之不可以\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

elif mat2:

res_message=u"规则8-中文语句:全角双引号(“”)中可出现单引号‘’,反之不可以\n出错范围:%s"%("("+str(mat2.span()[0])+','+str(mat2.span()[1])+")")

else :

res_message=u"规则8-中文语句:全角双引号(“”)中可出现单引号‘’,反之不可以\n出错范围:%s"%("("+str(mat3.span()[0])+','+str(mat3.span()[1])+")")

return (res_status,res_message)

#中文语句:全角双引号内不允许含有全角分号、冒号

def rule_nine(aUnicodeStr):

pat1=re.compile(u'[“]+[^“”]*[:]+[”]')

pat2=re.compile(u'[“]+[^“”]*[;]+[”]')

res_status=check_stauts_ok_str

res_message=''

mat1=pat1.search(aUnicodeStr)

mat2=pat2.search(aUnicodeStr)

if mat1 or mat2:

res_status=check_stauts_fail_str

if mat1:

res_message=u"规则9-中文语句:全角双引号内不允许含有全角分号、冒号\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

else:

res_message=u"规则9-中文语句:全角双引号内不允许含有全角分号、冒号\n出错范围:%s"%("("+str(mat2.span()[0])+','+str(mat2.span()[1])+")")

return (res_status,res_message)

#中文语句:括号内包含纯中文或同时包含中文及英文和数字时,使用全角括号,括号前后不加空格。

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=pat1.search(aUnicodeStr)

mat2=pat2.search(aUnicodeStr)

mat3=pat3.search(aUnicodeStr)

mat4=pat4.search(aUnicodeStr)

mat5=pat5.search(aUnicodeStr)

if mat1 or mat2 or \

mat3 or mat4 or \

mat5:

res_status=check_stauts_fail_str

if mat1:

res_message=u"规则10-中文语句:括号内包含纯中文或同时包含中文及英文和数字时,使用全角括号,括号前后不加空格\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

elif mat2:

res_message=u"规则10-中文语句:括号内包含纯中文或同时包含中文及英文和数字时,使用全角括号,括号前后不加空格\n出错范围:%s"%("("+str(mat2.span()[0])+','+str(mat2.span()[1])+")")

elif mat3:

res_message=u"规则10-中文语句:括号内包含纯中文或同时包含中文及英文和数字时,使用全角括号,括号前后不加空格\n出错范围:%s"%("("+str(mat3.span()[0])+','+str(mat3.span()[1])+")")

elif mat4:

res_message=u"规则10-中文语句:括号内包含纯中文或同时包含中文及英文和数字时,使用全角括号,括号前后不加空格\n出错范围:%s"%("("+str(mat4.span()[0])+','+str(mat4.span()[1])+")")

else :

res_message=u"规则10-中文语句:括号内包含纯中文或同时包含中文及英文和数字时,使用全角括号,括号前后不加空格\n出错范围:%s"%("("+str(mat5.span()[0])+','+str(mat5.span()[1])+")")

return (res_status,res_message)

#中文语句:括号内的内容为纯英文、纯数字或纯半角英文符号时,使用半角括号,括号前后加半角空格。

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=pat1.search(aUnicodeStr)

mat2=pat2.search(aUnicodeStr)

mat3=pat3.search(aUnicodeStr)

#mat4=pat4.search(aUnicodeStr)

mat5=pat5.search(aUnicodeStr)

mat6=pat6.search(aUnicodeStr)

mat7=pat7.search(aUnicodeStr)

if mat2 or \

mat3 or \

mat5 or mat6 or \

mat7 :

res_status=check_stauts_fail_str

#if mat1:

# res_message=u"规则11-中文语句:括号内的内容为纯英文、纯数字或纯半角英文符号时,使用半角括号,括号前后加半角空格\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

if mat2:

res_message=u"规则11-中文语句:括号内的内容为纯英文、纯数字或纯半角英文符号时,使用半角括号,括号前后加半角空格\n出错范围:%s"%("("+str(mat2.span()[0])+','+str(mat2.span()[1])+")")

elif mat3:

res_message=u"规则11-中文语句:括号内的内容为纯英文、纯数字或纯半角英文符号时,使用半角括号,括号前后加半角空格\n出错范围:%s"%("("+str(mat3.span()[0])+','+str(mat3.span()[1])+")")

#elif mat4:

# res_message=u"规则11-中文语句:括号内的内容为纯英文、纯数字或纯半角英文符号时,使用半角括号,括号前后加半角空格\n出错范围:%s"%("("+str(mat4.span()[0])+','+str(mat4.span()[1])+")")

elif mat5:

res_message=u"规则11-中文语句:括号内的内容为纯英文、纯数字或纯半角英文符号时,使用半角括号,括号前后加半角空格\n出错范围:%s"%("("+str(mat5.span()[0])+','+str(mat5.span()[1])+")")

elif mat6:

res_message=u"规则11-中文语句:括号内的内容为纯英文、纯数字或纯半角英文符号时,使用半角括号,括号前后加半角空格\n出错范围:%s"%("("+str(mat6.span()[0])+','+str(mat6.span()[1])+")")

else:

res_message=u"规则11-中文语句:括号内的内容为纯英文、纯数字或纯半角英文符号时,使用半角括号,括号前后加半角空格\n出错范围:%s"%("("+str(mat7.span()[0])+','+str(mat7.span()[1])+")")

return (res_status,res_message)

#中文语句:全角中文字符与半角英文字符和半角阿拉伯数字之间应有一个半角空格

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=pat1.search(aUnicodeStr)

mat2=pat2.search(aUnicodeStr)

if mat1 or mat2 :

res_status=check_stauts_fail_str

if mat1:

res_message=u"规则12-中文语句:全角中文字符与半角英文字符和半角阿拉伯数字之间应有一个半角空格\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

else:

res_message=u"规则12-中文语句:全角中文字符与半角英文字符和半角阿拉伯数字之间应有一个半角空格\n出错范围:%s"%("("+str(mat2.span()[0])+','+str(mat2.span()[1])+")")

return (res_status,res_message)

#中文语句:全角标点符号与前后字符之间均不留空。

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=pat1.search(aUnicodeStr)

mat2=pat2.search(aUnicodeStr)

if mat1 or mat2 :

res_status=check_stauts_fail_str

if mat1:

res_message=u"规则13-中文语句:全角标点符号与前后字符之间均不留空。\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

else:

res_message=u"规则13-中文语句:全角标点符号与前后字符之间均不留空。\n出错范围:%s"%("("+str(mat2.span()[0])+','+str(mat2.span()[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=pat1.search(aUnicodeStr)

if mat1:

res_status=check_stauts_fail_str

res_message=u"规则14-中文语句:全角标点符号与前后字符之间均不留空。\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

return (res_status,res_message)

中文语句:以下标点符号成对出现,且有先后顺序:

全角:()、“”、‘’,《》,{},【】

半角:()、{},[]

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']'}

#获取字符的个数

for (kT,vT) in symbol_count_map.items():

symbol_count_map[kT]=aUnicodeStr.count(kT)

#获取字符位置

for (kT,vT) in symbol_count_map.items():

if vT==0:

continue

else:

for i in range(1,vT+1):

symbol_pos_map[kT].append(get_substr_pos(aUnicodeStr,kT,i))

#检查是否成对出现,且前后顺序正确

for (kT,vT) in symbol_pair_map.items():

if symbol_count_map[kT] != symbol_count_map[vT]:

res_status=check_stauts_fail_str

res_message=u"规则15-中英文语句:()、“”、‘’,《》,{},【】 ()、{},[]必须成对出现,且有先后顺序"

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"规则15-中英文语句:()、“”、‘’,《》,{},【】 ()、{},[]必须成对出现,且有先后顺序"

break

if res_status == check_stauts_fail_str:

break

return (res_status,res_message)

#中文语句:中文后面的标点符号应为全角标点符号

def rule_sixteen(aUnicodeStr):

pat1=re.compile(u'[%s]+[%s]+'%(chinese_code,halfwidth_symbol))

res_status=check_stauts_ok_str

res_message=''

mat1=pat1.search(aUnicodeStr)

if mat1:

res_status=check_stauts_fail_str

res_message=u"规则16-中文语句:中文后面的标点符号应为全角标点符号。\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

return (res_status,res_message)

#中文语句:开头和结尾不能是半角、全角空格

def rule_seventeen(aUnicodeStr):

pat1=re.compile(u'^ +')

pat2=re.compile(u' +$')

res_status=check_stauts_ok_str

res_message=''

mat1=pat1.search(aUnicodeStr)

mat2=pat2.search(aUnicodeStr)

if mat1 or mat2:

res_status=check_stauts_fail_str

if mat1:

res_message=u"规则17-中文语句:开头和结尾不能是半角、全角空格。\n出错范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

else:

res_message=u"规则17-中文语句:开头和结尾不能是半角、全角空格。\n出错范围:%s"%("("+str(mat2.span()[0])+','+str(mat2.span()[1])+")")

return (res_status,res_message)

#中文语句:括号中的内容为独立的语句时,句号应包含在括号内

def rule_eightteen(aUnicodeStr):

pat1=re.compile(u'(+.*。+.*)+')

pat2=re.compile(u'(+.*)+.*。+')

res_status=check_stauts_ok_str

res_message=''

mat1=pat1.search(aUnicodeStr)

mat2=pat2.search(aUnicodeStr)

if mat1 or mat2:

res_status=check_stauts_manual_str

if mat1:

res_message=u"规则18-中文语句:括号中的内容为独立的语句时,句号应包含在括号内。请人工检查\n检查范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

else :

res_message=u"规则18-中文语句:括号中的内容为独立的语句时,句号应包含在括号内。请人工检查\n检查范围:%s"%("("+str(mat2.span()[0])+','+str(mat2.span()[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"规则19-引用说话的语句或对特定词句进行强调时使用全角双引号(“”),注意前后双引号不同,请手工检查",

u'‘': u"规则20-双重引用时使用全角单引号(‘’),注意前后单引号不同,请手工检查",

u',': u"规则22-中文语句中的停顿应用全角逗号(,),请手工检查",

u'、': u"规则23-中文语句中的并列词间和中文语句中的英文并列词间均应该用全角顿号(、)分隔,而不用逗号。,请手工检查",

u'(': u"规则24-对于前一语句改换说法,或作补充说明时,使用圆括号。圆括号包括全角()和半角 () 两种形式,请手工检查",

u'(': u"规则24-对于前一语句改换说法,或作补充说明时,使用圆括号。圆括号包括全角()和半角 () 两种形式,请手工检查",

u':': u"规则25-列举项目时,使用全角冒号。2. 表示时间的 (:) 应使用半角冒号。,请手工检查",

u':': u"规则25-列举项目时,使用全角冒号。2. 表示时间的 (:) 应使用半角冒号。,请手工检查",

u'——':u"规则26-做补充说明或话题转换时使用中文全角破折号(——) ,请手工检查",

u'-': u"规则26- 当表示数值间的范围(例如日期、时间或数字),或当表示两个名词的复合,或表示图序、表序的标号时,使用英文半角连字符 (-) ,请手工检查",

u'《': u"规则27-书名、节目名、法律法规名等需要所以书名号(《》)进行标注,请手工检查 ",

u'%': u"规则28-针对占位符,如果占位符代替的是数字,则前后视情况加空格,如果代替的是中文,则无需空格,请手工检查 ",

u'%': u"规则28-针对占位符,如果占位符代替的是数字,则前后视情况加空格,如果代替的是中文,则无需空格 ,请手工检查",

u'月': u"规则30-针对日期,只有在日历里显示日期的时候不加空格,比如:2016年5月6日;在其他地方,比如设置里显示“开始于 1 月 1 日”的时候需要空格,请手工检查 ",

u'年': u"规则30-针对日期,只有在日历里显示日期的时候不加空格,比如:2016年5月6日;在其他地方,比如设置里显示“开始于 1 月 1 日”的时候需要空格,请手工检查",

u'日': u"规则30-针对日期,只有在日历里显示日期的时候不加空格,比如:2016年5月6日;在其他地方,比如设置里显示“开始于 1 月 1 日”的时候需要空格,请手工检查",

u'.': u"规则33-如果需要沿用原文中的外文缩写、外国人姓和名缩写、注册商标、产品名、公司名及国名的缩写,则用半角英文句点 (.) 来表示该缩写。3. 半角句点 (.) 也可用作数字中的小数点或文件名中的分隔符,请手工检查 ",

res_status=check_stauts_ok_str

res_message=''

for (kT,vT) in symbol_manual_map.items():

pat1=re.compile('[%s]+'%kT)

if pat1.search(aUnicodeStr):

res_status=check_stauts_manual_str

res_message=vT

break

return (res_status,res_message)

引号:3. 除非引用的内容与标点符号相对独立,否则句号(。)、逗号(,)、问号(?)、感叹号(!)应保留在双引号内,

并采用全角输入。

def rule_twentyone(aUnicodeStr):

pat1=re.compile(u'“+[^”]*[。,?!.\,\?\!]+')

pat2=re.compile(u'”+[。,?!.\,\?\!]+')

res_status=check_stauts_ok_str

res_message=''

mat1=pat1.search(aUnicodeStr)

mat2=pat2.search(aUnicodeStr)

if mat1 or mat2:

res_status=check_stauts_manual_str

if mat1:

res_message=u"规则21-中文语句:除非引用的内容与标点符号相对独立,否则句号(。)、逗号(,)、问号(?)、感叹号(!)应保留在双引号内,并采用全角输入\n检查范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

else :

res_message=u"规则21-中文语句:除非引用的内容与标点符号相对独立,否则句号(。)、逗号(,)、问号(?)、感叹号(!)应保留在双引号内,并采用全角输入\n检查范围:%s"%("("+str(mat2.span()[0])+','+str(mat2.span()[1])+")")

return (res_status,res_message)

数字与英文单位间加一个半角空格

def rule_twentynine(aUnicodeStr):

pat1=re.compile(u'[0-9]+[  ]*[a-zA-Z]+')

res_status=check_stauts_ok_str

res_message=''

mat1=pat1.search(aUnicodeStr)

if mat1:

res_status=check_stauts_manual_str

res_message=u"规则29-数字与英文单位间加一个半角空格\n检查范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

return (res_status,res_message)

标点符号连续出现

def rule_thirtyone(aUnicodeStr):

pat1=re.compile(u'[\!\%\(\)\{\}\[\]\;\:\'\"\?\,\.。!\%()\{\}【】;:’“”’?,。、《》]{2,}')

res_status=check_stauts_ok_str

res_message=''

mat1=pat1.search(aUnicodeStr)

if mat1:

res_status=check_stauts_manual_str

res_message=u"规则31-标点符号连续出现\n检查范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

return (res_status,res_message)

中文语句:英文字母、数字后面如果是标点符号,则应该是半角

def rule_thirtytwo(aUnicodeStr):

pat1=re.compile(u'[a-zA-Z0-9]+[\!\%\(\)\{\}\[\]\;\:\'\"\?\,\.。!\%()\{\}【】;:’“”’?,。、《》]+')

res_status=check_stauts_ok_str

res_message=''

mat1=pat1.search(aUnicodeStr)

if mat1:

res_status=check_stauts_manual_str

res_message=u"规则32-英文字母、数字后面如果是标点符号,则应该是半角\n检查范围:%s"%("("+str(mat1.span()[0])+','+str(mat1.span()[1])+")")

return (res_status,res_message)

def get_substr_pos(aString, subStr, findCnt):

listStr = aString.split(subStr,findCnt)

if len(listStr) <= findCnt:

return -1

return len(aString)-len(listStr[-1])-len(subStr)

#中文语句是:含有至少一个中文(数字、标点符号不作为判断依据)

def check_iseng(aUnicodeStr):

pat1=re.compile(u'[%s]'%chinese_code)

res=True

if pat1.search(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, chardet.detect(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):

#规则1:中/英文语句:无全角英文、无全角数字、无全角空格

(res_status,res_message)=rule_one(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则17:中英文语句:开头和结尾不能是半角、全角空格

(res_status,res_message)=rule_seventeen(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则15:中英文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_fifteen(uni_str)

if res_status!=check_stauts_ok_str:

break

if check_iseng(uni_str):#英文语句

#规则4:英文语句:不含有全角标点符号、全角空格、全角数字

(res_status,res_message)=rule_four(uni_str)

if res_status!=check_stauts_ok_str:

break

else:

#规则5:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_five(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则6:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_six(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则7:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_seven(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则8:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_eight(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则9:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_nine(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则10:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_ten(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则11:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_eleven(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则12:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_twelve(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则13:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_thirteen(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则14:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_fourteen(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则16:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_sixteen(uni_str)

if res_status!=check_stauts_ok_str:

break

#检查是否需要人工干预

#规则18:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_eightteen(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则19:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_nineteen(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则21:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_twentyone(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则29:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_twentynine(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则31:中文语句:以下标点符号成对出现,且有先后顺序

(res_status,res_message)=rule_thirtyone(uni_str)

if res_status!=check_stauts_ok_str:

break

#规则32:中文语句:以下标点符号成对出现,且有先后顺序

(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'检查错误语句列表:\n\n'}

str_array=aBuffer.split('\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'出错原因:'+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"请停止(4k) 录像。")[0]

print rule_eleven(u"请停止(4k) 录像。")[1]

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
1300万!Haynes:德罗赞对拿全额中产零兴趣 湖热想引进或得签换

1300万!Haynes:德罗赞对拿全额中产零兴趣 湖热想引进或得签换

直播吧
2024-07-03 06:10:02
2024江苏这所中学本科达线率100%、本一率99.3%,誉为一本收割机

2024江苏这所中学本科达线率100%、本一率99.3%,誉为一本收割机

户外阿毽
2024-07-03 01:22:51
三大消息:中国传出好消息!中美已达成合作;历史性时刻到了?

三大消息:中国传出好消息!中美已达成合作;历史性时刻到了?

嘿哥哥科技
2024-07-02 18:36:18
2个3-0!商竣程创纪录,张之臻伟大成就,金花2胜5负,郑钦文翻车

2个3-0!商竣程创纪录,张之臻伟大成就,金花2胜5负,郑钦文翻车

刘姚尧的文字城堡
2024-07-02 07:49:35
官方:泰国足协举办邀请赛,邀请叙利亚、塔吉克和菲律宾参赛

官方:泰国足协举办邀请赛,邀请叙利亚、塔吉克和菲律宾参赛

直播吧
2024-07-02 20:04:18
太难了!建行将进行大规模的降薪10%?高级官员将大幅度削减工资

太难了!建行将进行大规模的降薪10%?高级官员将大幅度削减工资

火山诗话
2024-07-02 17:17:57
美国被困宇航员可能回不来了!美联航调查发现:责任全在印度

美国被困宇航员可能回不来了!美联航调查发现:责任全在印度

奇点使者
2024-07-01 18:42:11
有疑似“穿越者”提前预言,难道中国羽毛球运动员张志杰离世或许没那么简单?

有疑似“穿越者”提前预言,难道中国羽毛球运动员张志杰离世或许没那么简单?

解筱文
2024-07-01 22:58:22
社论《党是领导一切的》 1974年7月1日《人民日报》

社论《党是领导一切的》 1974年7月1日《人民日报》

那些看得见的老照片
2024-07-01 17:30:02
美国下达全球通缉令,逮捕中国科学家陈正坤,现在怎么样了?

美国下达全球通缉令,逮捕中国科学家陈正坤,现在怎么样了?

杨哥历史
2024-07-02 14:10:43
闹大了!南方医科大发布招生简章,网友炸锅,评论区一片“骂声”

闹大了!南方医科大发布招生简章,网友炸锅,评论区一片“骂声”

皖声微言
2024-07-01 14:49:13
堵上“安卓套壳”的嘴!中国信通院认证华为鸿蒙内核100%自研

堵上“安卓套壳”的嘴!中国信通院认证华为鸿蒙内核100%自研

热点科技
2024-07-01 15:49:32
31省养老金调整方案已全部落地!看看哪个省定额调整更多?

31省养老金调整方案已全部落地!看看哪个省定额调整更多?

兵哥闲聊
2024-07-02 07:52:37
除了爱国,它们什么都不会!

除了爱国,它们什么都不会!

吴女士
2024-07-02 10:18:04
在台上:我爱我的国,我的国需要我!下了台:加州伯克利真香!

在台上:我爱我的国,我的国需要我!下了台:加州伯克利真香!

体制内老陈
2024-07-01 15:19:32
她们说啥你都信,那就怪不得别人了

她们说啥你都信,那就怪不得别人了

民言民语
2024-07-02 13:17:10
绝了,1亿天才签约前反悔!皇马一场空!佛爷失望,转挖拜仁巨星

绝了,1亿天才签约前反悔!皇马一场空!佛爷失望,转挖拜仁巨星

阿泰希特
2024-07-02 11:32:10
面筋哥捐款从两百万改为了30万,但捐款的人还是寥寥无几

面筋哥捐款从两百万改为了30万,但捐款的人还是寥寥无几

映射生活的身影
2024-07-02 15:37:57
35.1℃,今年上海首个高温日诞生!最新预警:今夜局部仍有大雨

35.1℃,今年上海首个高温日诞生!最新预警:今夜局部仍有大雨

鲁中晨报
2024-07-02 19:39:13
深圳到中山的深中通道投入使用后看似毫不相关的珠海是最大赢家

深圳到中山的深中通道投入使用后看似毫不相关的珠海是最大赢家

辽宁打工者谈城市发展
2024-07-01 22:18:56
2024-07-03 07:12:49
流颜菲雨桃花路
流颜菲雨桃花路
一遍又一遍的去重温经典动漫
46文章数 0关注度
往期回顾 全部

科技要闻

旧车比新车贵,比亚迪断了二手车贩子活路

头条要闻

欧洲杯-中卫双响土耳其2-1奥地利 进8强将战荷兰

头条要闻

欧洲杯-中卫双响土耳其2-1奥地利 进8强将战荷兰

体育要闻

世界第二打第三,成了一场英格兰模仿秀

娱乐要闻

未火先塌?流量的路子不好走啊

财经要闻

张军:房地产是经济收缩的受害者而非原因

汽车要闻

18.96万 奕派eπ007 540纯电四驱Pro上市

态度原创

手机
数码
时尚
本地
军事航空

手机要闻

iPhone 16 可能采用来自三星的先进相机传感器

数码要闻

狂飙支持1000MB/s!朗科US9高速固态U盘图赏

夏天最美的4个颜色,这样穿高级又时髦!

本地新闻

冷知识:东北雪糕才是最早的网红雪糕

军事要闻

泽连斯基称不排除通过中间方谈判的可能性 克宫表态

无障碍浏览 进入关怀版