2

Python を使用して、特定の文字列に続く MediaWiki マークアップでフォーマットされたコンテンツを抽出したいと考えています。たとえば、2012 年の米国大統領選挙の記事には、「nominee1」と「nominee2」というフィールドが含まれています。おもちゃの例:

In [1]: markup = get_wikipedia_markup('United States presidential election, 2012')
In [2]: markup
Out[2]:
u"{{
| nominee1 = '''[[Barack Obama]]'''\n
| party1 = Democratic Party (United States)\n
| home_state1 = [[Illinois]]\n
| running_mate1 = '''[[Joe Biden]]'''\n
| nominee2 = [[Mitt Romney]]\n
| party2 = Republican Party (United States)\n
| home_state2 = [[Massachusetts]]\n
| running_mate2 = [[Paul Ryan]]\n
}}"

例として上記の選挙記事を使用して、「nomineeN」フィールドの直後にあるが、次のフィールドの呼び出しの前に存在する情報を抽出したいと思います (ピップ「|」で区切られます)。したがって、上記の例を考えると、「バラク・オバマ」と「ミット・ロムニー」、または少なくともそれらが埋め込まれている構文 ('''[[バラク・オバマ]]''' と [ [ミット・ロムニー]])。他の正規表現はwikimarkup からリンクを抽出しましたが、肯定的な後読みアサーションを使用する私の (失敗した) 試みは、次のようなものでした:

nominees = re.findall(r'(?<=\|nominee\d\=)\S+',markup)

私の考えでは、"|nominee1=" や "|nominee2=" のような文字列を見つけて、"|"、"nominee"、"=" の間に空白を入れることができ、"Barack Obama" や "ミット・ロムニー」。

4

4 に答える 4

3

mwparserfromhellを使用してください。コードが凝縮され、結果をキャプチャするための安心感が高まります。この例で使用する場合:

import mwparserfromhell as mw
text = get_wikipedia_markup('United States presidential election, 2012')
code = mw.parse(text)
templates = code.filter_templates()
for template in templates:
    if template.name == 'Infobox election':
        nominee1 = template.get('nominee1').value
        nominee2 = template.get('nominee2').value
print nominee1
print nominee2

結果をキャプチャするために行うことは非常に簡単です。

于 2012-12-31T03:22:52.257 に答える
1

このようなインフォボックスデータの場合は、DBpediaを使用するのが最適です。彼らはあなたのためにすべての抽出作業を行いました:)

http://wiki.dbpedia.org/Downloads38

「オントロジーインフォボックスのプロパティ」ファイルを参照してください。ここでは、オントロジーの専門家である必要はありません。単純なtsvパーサーを使用して、必要な情報を見つけてください。

于 2012-12-15T00:24:52.027 に答える
1

ここでは後読みは必要ありません。一致するグループを使用して、文字列から何を抽出するかを正確に指定する方がはるかに簡単です。(実際、オプションのスペースによって式が可変幅になるため、Python の正規表現エンジンでは後読みは機能しません。)

この正規表現を試してください:

\|\s*nominee\d+\s*=\s*(?:''')?\[\[([^]]+)\]\](?:''')?

結果:

re.findall(r"\|\s*nominee\d+\s*=\s*(?:''')?\[\[([^]]+)\]\](?:''')?", markup)
# => ['Barack Obama', 'Mitt Romney']
于 2012-12-14T23:20:37.453 に答える
0

まず、 の後にスペースがありませんnominee\d。あなたはおそらくしたいですnominee\d\s*\=。さらに、正規表現でマークアップを解析したくありません代わりに、ここにある提案のいずれかを使用してみてください。

正規表現を使用する必要がある場合は、もう少し読みやすい複数行のソリューションを使用しないでください。

import re

markup_string = """{{
| nominee1 = '''[[Barack Obama]]'''
| party1 = Democratic Party (United States)
| home_state1 = [[Illinois]]
| running_mate1 = '''[[Joe Biden]]'''
| nominee2 = [[Mitt Romney]]
| party2 = Republican Party (United States)
| home_state2 = [[Massachusetts]]
| running_mate2 = [[Paul Ryan]]<br>
}}"""

for match in re.finditer(r'(nominee\d\s*\=)[^|]*', markup_string, re.S):
    end_nominee, end_line = match.end(1), match.end(0)
    print end_nominee, end_line
    print markup_string[end_nominee:end_line]
于 2012-12-14T23:44:53.567 に答える