可能重复:
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=
}}
棘手的是,它需要计算其他{{
打开并}}
关闭以了解我想要停止的群组,但我不确定如何让正则表达式执行此操作。
答案 0 :(得分:2)
{{persondata(.*)}}
会贪婪地匹配。即它会尝试返回最长的匹配。如果您想获得最短的匹配,则应使用{{persondata(.*?)}}
。 (这个没有名字,也许节俭匹配?)
但是,在这种情况下,您的字符串中还有另一个}}
。你可以做一些聪明的事情,比如{{persondata((?:.*)}}(?:.*))}}
,但一般来说,一旦你到达递归结构(自己嵌套的结构),你应该放弃正则表达式并转向正确的解析解决方案。
您可能需要查看pyparsing
。
答案 1 :(得分:0)
为此目的创建了一个PyPI模块。请参阅mwparserfromhell。