正则表达式 - 如何使用子组

时间:2012-09-20 22:18:28

标签: python regex

  

可能重复:
  Matching Nested Structures With Regular Expressions in Python

我正在尝试匹配维基页面中的一组数据。下面列出了我使用的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()

维基页面内容的示例:

*[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=
}}

棘手的是,它需要计算其他{{打开并}}关闭以了解我想要停止的群组,但我不确定如何让正则表达式执行此操作。

2 个答案:

答案 0 :(得分:2)

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

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

您可能需要查看pyparsing

答案 1 :(得分:0)

为此目的创建了一个PyPI模块。请参阅mwparserfromhell