0

可能的重复:
用 Python 中的正则表达式匹配嵌套结构

我正在尝试匹配来自 wiki 页面的一组数据。下面列出了我正在使用的一些 python 代码。问题是它会在自己组的末尾返回到}}页面的最后一个。

def findPersonInfo(self):
    if (self.isPerson == True):
        regex = re.compile(r"{{persondata(.*)}}",re.IGNORECASE|re.UNICODE|re.DOTALL)
        result = regex.search(self._rawPage)
        if result:
            print 'Match found: ', result.group()

wiki 页面内容示例:

*[http://www.jsc.nasa.gov/Bios/htmlbios/acaba-jm.html NASA biography]

{{NASA Astronaut Group 19}}

{{Persondata
|NAME= Acaba, Joseph Michael "Joe"
|ALTERNATIVE NAMES=
|SHORT DESCRIPTION=[[Hydrogeologist]]
|DATE OF BIRTH={{Birth date and age|1967|5|17}}
|PLACE OF BIRTH=[[Inglewood, California]]
|DATE OF DEATH=
|PLACE OF DEATH=
}}
{{DEFAULTSORT:Acaba, Joseph M.}}
[[Category:1967 births]]

我当前的正则表达式返回以下字符串:

{{Persondata
|NAME= Acaba, Joseph Michael "Joe"
|ALTERNATIVE NAMES=
|SHORT DESCRIPTION=[[Hydrogeologist]]
|DATE OF BIRTH={{Birth date and age|1967|5|17}}
|PLACE OF BIRTH=[[Inglewood, California]]
|DATE OF DEATH=
|PLACE OF DEATH=
}}
{{DEFAULTSORT:Acaba, Joseph M.}}

我希望它返回:

{{Persondata
|NAME= Acaba, Joseph Michael "Joe"
|ALTERNATIVE NAMES=
|SHORT DESCRIPTION=[[Hydrogeologist]]
|DATE OF BIRTH={{Birth date and age|1967|5|17}}
|PLACE OF BIRTH=[[Inglewood, California]]
|DATE OF DEATH=
|PLACE OF DEATH=
}}

棘手的一点是它需要计算其他{{打开和}}关闭来知道我想停在哪个组,但我不知道如何让正则表达式来做到这一点。

4

2 回答 2

2

{{persondata(.*)}}会贪婪地匹配。即它将尝试返回可能的最长匹配。{{persondata(.*?)}}如果你想获得最短的匹配,你应该使用。(是没有这个名字,也许是节俭的搭配?)

但是,在这种情况下,您}}的字符串中有另一个。你可以做一些聪明的事情,比如{{persondata((?:.*)}}(?:.*))}},但一般来说,一旦你到达递归结构(嵌套自己的结构),你应该放弃正则表达式并转向正确的解析解决方案。

你可能想看看pyparsing.

于 2012-09-20T22:21:39.187 回答
0

PyPI 上有一个为此目的而创建的模块。见mwparserfromhell

于 2012-09-21T00:20:41.530 回答