2018年03月18日

言語処理100本ノックでPython入門 #26 - 正規表現の置換処理

  
今日は、言語処理100本ノック 2015の問題26です。

■ 問題

問題20で作成したファイルを入力として、以下の問題を解きます。
26. 強調マークアップの除去 25の処理時に,テンプレートの値からMediaWikiの強調マークアップ(弱い強調,強調,強い強調のすべて)を除去してテキストに変換せよ(参考: マークアップ早見表).

■ どうやって解くか


強調マークアップは、以下のように2つ以上の''で括ります。
''弱い強調''    
'''強調'''    
'''''強い強調'''''

このマークアップ('記号)だけを削除するということですね。

re.subメソッドを使って置換処理を行えばいいですね。 ちょっと手抜きですが、以下のような正規表現にしました。
for k, v in reg.findall(basicInfo):
    wdict[k] =  re.sub(r"''('|''')([^']+?)''+", r"\2", v)

4番目の引数として、回数を指定すると、置換する回数を指定できます。省略するとすべてを置換します。 今回は、すべてを置換対象とするので、第4引数は省略しています。


■ Pythonのコード
import re

def readArticle(filename):
    with open(filename, 'r', encoding='utf8') as fin:
        return fin.read()

def getBasicInfo(article):
    basicInfo = re.search(r'\{\{基礎情報(.+?)\}\}\n', article, re.DOTALL).group(1)
    pat = r'^\|(.+?)\s*=\s*(.+?)(?<!<br/>)\n'
    reg = re.compile(pat, re.MULTILINE | re.DOTALL)
    wdict = {}
    for k, v in reg.findall(basicInfo):
        v1 = re.sub(r"''('|''')([^']+?)''+", r"\2", v)
        wdict[k] = v1

    return wdict

def main():
    article = readArticle('england-article.txt')    
    dic = getBasicInfo(article)
    dic = sorted(dic.items(), key=lambda x: x[0])
    for item, v in dic:
        print(item, ':', v)

if __name__ == '__main__':
    main()


■ 結果

結果は長くなるので、該当箇所だけ抜き出したものを以下に示します。
確立形態4 : 現在の国号「グレートブリテン及び北アイルランド連合王国」に変更
でも、基礎情報のうち該当する個所が上の一か所なんだけど...
これで合ってるのかな?

元の行は以下の通りです。

確立形態4 : 現在の国号「'''グレートブリテン及び北アイルランド連合王国'''」に変更