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

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.

相关推荐
热点推荐
MicroStrategy:以约54亿美元购买55500枚比特币,平均价格约97862美元/枚

MicroStrategy:以约54亿美元购买55500枚比特币,平均价格约97862美元/枚

界面新闻
2024-11-25 21:25:38
特朗普政府最反华的华裔官员出炉,祖籍广东

特朗普政府最反华的华裔官员出炉,祖籍广东

大国纪录
2024-11-25 22:05:54
用铁路换1万亿矿产?阿富汗提出2个要求,中国有2大担忧?

用铁路换1万亿矿产?阿富汗提出2个要求,中国有2大担忧?

蜉蝣说
2024-11-15 11:50:01
这是在大英博物馆的真实龙袍,和你印象中的龙袍是否一致?

这是在大英博物馆的真实龙袍,和你印象中的龙袍是否一致?

视点历史
2024-11-24 19:10:19
人形机器人三大核心传感器梳理(附股)

人形机器人三大核心传感器梳理(附股)

小佩棋不蹦迪
2024-11-25 00:24:07
野性十足,实力巨大的三个星座

野性十足,实力巨大的三个星座

别人都叫我阿螫
2024-11-23 09:49:48
继母来我家37年,父亲走后她不告而别,回老家看到她时我红了眼眶

继母来我家37年,父亲走后她不告而别,回老家看到她时我红了眼眶

绾绾说情感
2024-11-25 23:16:48
为什么美人计被称为三十六计第一计?网友:此计,无人能敌!

为什么美人计被称为三十六计第一计?网友:此计,无人能敌!

美好客栈大掌柜
2024-11-25 00:40:03
44岁张柏芝三胎儿子正面照曝光,6岁小儿子长相和妈妈如复制粘贴

44岁张柏芝三胎儿子正面照曝光,6岁小儿子长相和妈妈如复制粘贴

最炫时尚
2024-11-26 00:05:13
李家超率香港工商界约80人代表团抵穗!将访问大湾区五城

李家超率香港工商界约80人代表团抵穗!将访问大湾区五城

南方都市报
2024-11-25 22:27:12
恭喜C罗!国际足联官方致敬!世界杯首人对标梅西,尽显球王牌面

恭喜C罗!国际足联官方致敬!世界杯首人对标梅西,尽显球王牌面

阿泰希特
2024-11-25 12:37:44
参战免债!1000万卢布,普京签了!梅德韦杰夫谈新武器:用现代手段不可能击落,防空洞也“无济于事”

参战免债!1000万卢布,普京签了!梅德韦杰夫谈新武器:用现代手段不可能击落,防空洞也“无济于事”

每日经济新闻
2024-11-24 22:32:17
多没文化才要把叶嘉莹称“先生”

多没文化才要把叶嘉莹称“先生”

陶舜财经
2024-11-24 19:47:18
33岁女干部出轨男干部,提供节育证明太主动,双方外形相差大!

33岁女干部出轨男干部,提供节育证明太主动,双方外形相差大!

古希腊掌管松饼的神
2024-11-21 15:03:25
媒体人:王楚钦前三板解决张本智和注定载入史册,现在他独领风骚

媒体人:王楚钦前三板解决张本智和注定载入史册,现在他独领风骚

直播吧
2024-11-25 20:07:43
重组!阿森纳后腰换代,6000万签快攻爆点,美丽足球回来了

重组!阿森纳后腰换代,6000万签快攻爆点,美丽足球回来了

球文速递
2024-11-25 13:43:02
A股市场:如果你连量价关系都搞不明白,那么再做十年也很难赚钱

A股市场:如果你连量价关系都搞不明白,那么再做十年也很难赚钱

价值投资者
2024-11-09 13:13:08
61岁韦唯:住纽约豪宅,熬死家暴自己的外国前夫,儿子让她很痛苦

61岁韦唯:住纽约豪宅,熬死家暴自己的外国前夫,儿子让她很痛苦

简读视觉
2024-11-09 17:31:29
7万多件羽绒服全造假?含绒量基本为0,回应敷衍,官方曝更多细节

7万多件羽绒服全造假?含绒量基本为0,回应敷衍,官方曝更多细节

慎独赢
2024-11-25 16:24:38
刚刚返俄,博格丹说了一番大实话,他的清醒给很多人好好上了一课

刚刚返俄,博格丹说了一番大实话,他的清醒给很多人好好上了一课

千里持剑
2024-11-25 15:25:20
2024-11-26 04:44:49

科技要闻

特斯拉又降价,知情人士:冲刺今年销售目标

头条要闻

挪威史上最大规模性丑闻 妇科医生20年强奸87名患者

头条要闻

挪威史上最大规模性丑闻 妇科医生20年强奸87名患者

体育要闻

杨瀚森这态度,是打不了NBA的...

娱乐要闻

爆料郑雨盛和女模特,女方非正常怀孕

财经要闻

刘煜辉最新演讲全文:蛇的策略

汽车要闻

特斯拉限时优惠:Model Y仅23.99万起 还能5年0息

态度原创

房产
数码
家居
旅游
公开课

房产要闻

合生把上百个亿万富豪搞破防了

数码要闻

雷神银翼 F60 投影仪 1499 元首销,支持 800CVIA 亮度

家居要闻

素韵留白 极简空间的空灵之境

旅游要闻

雪下了这么厚!来看银装素裹的箭扣长城

公开课

一块玻璃,如何改变人类世界?

无障碍浏览 进入关怀版