User:P-bot/标点符号修正表
外观
以下内容可直接加入user-fixes.py中。
import re
pmarks = []
pmarks.append([]) # 书名号
pmarks.append([]) # 通常使用
pmarks.append([]) # 冒号、分号
pmarks.append([]) # 年份專用
def PunctuationMark( text, table ):
if text.isdigit():
return text
pmarks[table].append( text )
num = str(len(pmarks[table]) - 1)
return '\x07%d0000%s\x07' % (table, num)
def PunctuationMarkReplace( text, table ):
newtext = ''
rex = re.compile( ur'\x07%d0000(\d*)\x07' % table )
while True:
newtext = rex.sub(lambda m: PunctuationMarkReplacement( m.group(1), table ), text)
text = rex.sub(lambda m: PunctuationMarkReplacement( m.group(1), table ), newtext)
if newtext == text:
break
return text
def PunctuationMarkReplacement( id, table ):
return pmarks[table][int(id)]
def PunctuationMarkClean( text ):
pmarks = []
pmarks.append([]) # 书名号
pmarks.append([]) # 通常使用
pmarks.append([]) # 冒号、分号
pmarks.append([]) # 年份專用
return text
fixes['zh-punctuation1'] = {
'regex': True,
'msg': {
'zh': u'机器人:标点符号标准化(程序版本:1.04)',
},
'replacements': [
(ur'《.*》', lambda m:PunctuationMark( m.group(0), 0 )), # 书名号屏蔽开始:《》
(ur'[\-\{]\{[\s\S]*?\}[\}\-]', lambda m:PunctuationMark( m.group(0), 0 )), # {{}}, -{}-
(ur'\[\[.*?[\|\]]', lambda m:PunctuationMark( m.group(0), 0 )), # [[|
(ur'\[\s*([hH][tT]{2}[pP][sS]?|[fF][tT][pP]):.*?[ \]]', lambda m:PunctuationMark( m.group(0), 0 )), # []
(ur'([hH][tT]{2}[pP][sS]?|[fF][tT][pP]):\S*', lambda m:PunctuationMark( m.group(0), 0 )), #http
(ur'〈', ur'{{〈}}'),
(ur'〉', ur'{{〉}}'), #书名号处理完成
(ur'^[\s\S]*$', lambda m:PunctuationMarkReplace( m.group(0), 0 )), # 消除书名号屏蔽
(ur'<!--[\s\S]*?-->', lambda m:PunctuationMark( m.group(0), 1 )), # 普通屏蔽开始:<!-- xxxx -->
(ur'[\-\{]\{[\s\S]*?\}[\}\-]', lambda m:PunctuationMark( m.group(0), 1 )), # {{}}, -{}-
(ur'\[\[.*?[\|\]]', lambda m:PunctuationMark( m.group(0), 1 )), # [[|
(ur'\[\s*([hH][tT]{2}[pP][sS]?|[fF][tT][pP]):.*?[ \]]', lambda m:PunctuationMark( m.group(0), 1 )), # []
(ur'([hH][tT]{2}[pP][sS]?|[fF][tT][pP]):\S*', lambda m:PunctuationMark( m.group(0), 1 )), #http
(ur'\|-+', lambda m:PunctuationMark( m.group(0), 1 )), #td标号
(ur'<\s*[gG][aA][lL]{2}[eE][rR][yY]\s*>[\s\S]*?<\s*/\s*[gG][aA][lL]{2}[eE][rR][yY]\s*>', lambda m:PunctuationMark( m.group(0), 1 )), # gallery
(ur'<\s*[rR][eE][fF][\s\S]*?<\s*/\s*[rR][eE][fF]\s*>', lambda m:PunctuationMark( m.group(0), 1 )), # ref
(ur'<\s*[nN][oO][wW][iI][kK][iK][\s\S]*?<\s*/\s*[nN][oO][wW][iI][kK][iK]\s*>', lambda m:PunctuationMark( m.group(0), 1 )), # nowiki
(ur'<\s*[mM][aA][tT][hH][\s\S]*?<\s*/\s*[mM][aA][tT][hH]\s*>', lambda m:PunctuationMark( m.group(0), 1 )), # nowiki
(ur'(^|[\r\n]) +.*', lambda m:PunctuationMark( m.group(0), 1 )), # <pre>段落
(ur'/{2,}', lambda m:PunctuationMark( m.group(0), 1 )), # //
(ur'\.(公司|公司|网络|網絡|中国|中國)', lambda m:PunctuationMark( m.group(0), 1 )), # .公司、.网络、.中国等
(ur'(?P<date1>\d{1,4}年?(\d{1,2}月)?(\d{1,2}日)?)\s*(—|-||‒|–|—|―|_|~|~)+\s*(?P<date2>\d{1,4}年(\d{1,2}月)?(\d{1,2}日)?)', ur'\g<date1>-\g<date2>'),
(ur'——', lambda m:PunctuationMark( m.group(0), 1 )), # 已有破折号
(ur'(?P<date1>\d{1,4}年(\d{1,2}月)?(\d{1,2}日)?)[ \t]*(—|-||‒|–|—|―|_|~|~)+[ \t]*', ur'\g<date1>-'),
(ur'[ \t]*(—|-||‒|–|—|―|_|~|~)[ \t]*(?P<date2>\d{1,4}年(\d{1,2}月)?(\d{1,2}日)?)', ur'-\g<date2>'),
(ur'(?P<date1>\d{1,2}世[紀纪])[ \t]*(—|-||‒|–|—|―|_|~|~)+[ \t]*', ur'\g<date1>-'),
(ur'[ \t]*(—|-||‒|–|—|―|_|~|~)+[ \t]*(?P<date2>\d{1,2}世[紀纪])', ur'-\g<date2>'),
(ur'([\u2018-\u9fa5\]])[ \t]*/[ \t]*', ur'\1/'), # 斜杠
(ur'[ \t]*/[ \t]*([\u2018-\u9fa5])', ur'/\1'),
(ur'[ \t]*,[ \t]*([\u2018-\u9fa5])', ur',\1'), # 逗号
(ur'([\u2018-\u9fa5\]])[ \t]*,[ \t]*', ur'\1,'),
(ur'﹔', ur';'),
(ur'﹐', ur','),
(ur'﹑', ur'、'),
(ur'[﹒‧•・]', ur'·'),
(ur'﹕', ur':'),
(ur'﹖', ur'?'),
(ur'﹗', ur'!'),
(ur'﹙', ur'('),
(ur'﹚', ur')'),
(ur'﹛', ur'('),
(ur'﹜', ur')'),
(ur'﹝', ur'('),
(ur'﹞', ur')'),
(ur'︰', ur':'),
(ur'「', ur'「'),
(ur'」', ur'」'),
(ur'(^|[\r\n]);+.*', lambda m:PunctuationMark( m.group(0), 2 )), # 每段开头的半角分号:;
(ur'(^|[\r\n])[*#:;\-]+', lambda m:PunctuationMark( m.group(0), 2 )), # 冒号、分号屏蔽,每段开头的半角冒号::
(ur'&.*?;', lambda m:PunctuationMark( m.group(0), 2 )), # 如
(ur'[ \t]*\:[ \t]*([\u2018-\u9fa5])', ur':\1'), # 冒号
(ur'([\u2018-\u9fa5\]])[ \t]*\:[ \t]*', ur'\1:'),
(ur'[ \t]*;[ \t]*([\u2018-\u9fa5])', ur';\1'), # 分号
(ur'([\u2018-\u9fa5\]])[ \t]*;[ \t]*', ur'\1;'),
(ur'[ \t]*((-||‒|–|—|―){2,}|-{3,})[ \t]*', ur'——'), # 破折號
(ur'^[\s\S]*$', lambda m:PunctuationMarkReplace( m.group(0), 2 )), # 消除冒号、分号屏蔽
#以下是影响范围太大的屏蔽
(ur'[ -\'\*-,\.-Z\\\^`-z~-¬®°-ё※-⌒]+[ \t]*\([ -\'\*-Z\\\^`-z~-¬®°-ё※-⌒]*\)', lambda m:PunctuationMark( m.group(0), 1 )), # 毗邻英文字符串的括号
(ur'\([ -\'\*-Z\\\^`-z~-¬®°-ё※-⌒]*\)[ \t]*[ -\'\*-,\.-Z\\\^`-z~-¬®°-ё※-⌒]+', lambda m:PunctuationMark( m.group(0), 1 )), # 毗邻英文字符串的括号
(ur'[!-\'\*-,\.-Z\\\^`-z~-¬®°-ё※-⌒]{2,}', lambda m:PunctuationMark( m.group(0), 1 )), # 英文字符串,普通屏蔽结束
(ur'[ \t]*\(\s*([\u2018-\u9fa5])', ur'(\1'), # 括号
(ur'([\u2018-\u9fa5\]])\s*\)[ \t]*', ur'\1)'),
(ur'\s*\)\s*([\u2018-\u9fa5\]])', ur')\1'),
(ur'([\u2018-\u9fa5\]])\s*\(\s*', ur'\1('),
(ur'[ \t]*\.[ \t]*([\u2018-\u9fa5])', ur'。\1'), # 句号
(ur'([\u2018-\u9fa5\]])[ \t]*\.[ \t]*', ur'\1。'),
(ur'[ \t]*\?[ \t]*([\u2018-\u9fa5])', ur'?\1'), # 问号
(ur'([\u2018-\u9fa5\]])[ \t]*\?[ \t]*', ur'\1?'),
(ur'\(([^\(\)()]*?))', ur'(\1)'),
(ur'(([^\(\)()]*?)\)', ur'(\1)'),
(ur'[ \t]*([()])[ \t]*', ur'\1'),
(ur' ([()])', ur'\1'),
(ur'([()]) ', ur'\1'),
(ur'^[\s\S]*$', lambda m:PunctuationMarkReplace( m.group(0), 1 )), # 消除普通屏蔽
(ur'——', lambda m:PunctuationMark( m.group(0), 3 )), #破折号,年份世紀屏蔽开始
(ur'(-\{|\}-)', lambda m:PunctuationMark( m.group(0), 3 )), #不转换标号
(ur'(?P<date1>\d{1,4}年)\]\][ \t]*(—|-||‒|–|—|―|_|~|~)+[ \t]*', ur'\g<date1>]]-'),
(ur'[ \t]*(—|-||‒|–|—|―|_|~|~)+[ \t]*\[\[(?P<date2>\d{1,4}年)', ur'-[[\g<date2>'),
(ur'(?P<date1>(\d{1,2}月)(\d{1,2}日?))\]\][ \t]*(—|-||‒|–|—|―|_|~|~)+[ \t]*', ur'\g<date1>]]-'),
(ur'[ \t]*(—|-||‒|–|—|―|_|~|~)+[ \t]*\[\[(?P<date2>(\d{1,2}月)(\d{1,2}日?))', ur'-[[\g<date2>'),
(ur'(?P<date1>\d{1,2}世[紀纪])\]\][ \t]*(—|-||‒|–|—|―|_|~|~)+[ \t]*', ur'\g<date1>]]-'),
(ur'[ \t]*(—|-||‒|–|—|―|_|~|~)+[ \t]*\[\[(?P<date2>\d{1,2}世[紀纪])', ur'-[[\g<date2>'),
(ur'^[\s\S]*$', lambda m:PunctuationMarkReplace( m.group(0), 3 )), # 消除年份世紀屏蔽
(ur'^.', lambda m: PunctuationMarkClean(m.group(0))), # 清空mark表
(ur'([iI][mM][aA][gG][eE]|[fF][iI][lL][eE]):', '\1:' ), # 捆绑一点小功能
(ur'(^|[\r\n])[*#::;]+', lambda m: m.group(0).replace(u':',':').replace(u';',';'))
],
'exceptions': {
'inside': [
ur'摩[尔爾]?斯[电電密][码碼]',
ur'化[學学]',
ur'[數数][学學]',
],
'title': [
ur'1.2.3.4.*',
ur'0\.99+.*',
],
}
}