用于从wiki模板标记中提取字段的正则表达式

2024-10-04 03:20:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用Python提取MediaWiki标记中格式化的内容,并将其置于特定字符串之后。例如,2012 U.S. presidential election article,包含名为“nomined1”和“nomined2”的字段。玩具示例:

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
}}"

以上面的选举文章为例,我想提取紧跟在“nomineden”字段后面但在调用下一个字段(用pip“|”分隔)之前存在的信息。因此,在上面的例子中,我希望提取出“Barack Obama”和“Mitt Romney”—或者至少是它们嵌入的语法('[[Barack Obama]]''和[[Mitt Romney]])。其他regex有extracted links from the wikimarkup,但我(失败)尝试使用positive lookbehind assertion有点像:

^{pr2}$

我的想法是,它应该找到像“| nominate1=”和“| nomined2=”这样的字符串,在“|”、“nominate”、“=”之间可能有一些空格,然后返回后面的内容,如“Barack Obama”和“Mitt Romney”。在


Tags: 字符串in内容homepartyunitedmarkupstates
3条回答

对于这样的infobox数据,最好使用DBpedia。他们为你做了所有的提取工作:)

http://wiki.dbpedia.org/Downloads38

请参阅“本体信息框属性”文件。你不必成为本体论专家。只需使用简单的tsv解析器就可以找到您需要的信息!在

使用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

很简单的事情来捕捉结果。在

在这里,从lookings中提取的字符串应该更容易使用。(事实上,lookbehind在这里不能与Python的正则表达式引擎一起工作,因为可选的空格使表达式的宽度可变。)

试试这个正则表达式:

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

结果:

^{pr2}$

相关问题 更多 >