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 )), # 如 &nbsp;
                (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'&nbsp;([()])', ur'\1'),
                (ur'([()])&nbsp;', 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+.*',
                ],
        }
}