Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式-如何使用子组_Python_Regex - Fatal编程技术网

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

Python 正则表达式-如何使用子组,python,regex,Python,Regex,可能重复: 我正在尝试匹配wiki页面中的一组数据。下面列出了我正在使用的python代码。问题是,它返回到页面中最后一个}的组末尾 def findPersonInfo(self): if (self.isPerson == True): regex = re.compile(r"{{persondata(.*)}}",re.IGNORECASE|re.UNICODE|re.DOTALL) result = regex.search(self._raw

可能重复:

我正在尝试匹配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=
}}
棘手的一点是,它需要计算其他的
{{
打开和
}
关闭,以知道我想停在哪个组,但我不确定如何让regex做到这一点。

{{persondata(.*)}
将非常匹配。也就是说,它将尝试返回尽可能长的比赛。如果要获得尽可能短的匹配,应该使用
{{persondata(.*?}}}
。(是否对此没有名称,可能是节俭匹配?)

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


您可能想看看pyparsing,PyPI上有一个模块就是为此而创建的。请参阅。

r{{persondata([^}]*)}}
假设没有嵌套的大括号…但这将给出同样错误的结果,在
|出生日期={{BIRTH DATE and age | 1967 | 5 | 17}
之后终止。因此,在标准python中实现这一点的唯一方法是不使用regex并编写我的一个函数来处理递归大括号?奇怪的是,我使用过的每一种语言似乎都在没有外部库的情况下支持递归。正如他们在编译器类中所说的,正则表达式不能计数(也就是说,它们不维护一个堆栈来计数无限嵌套的结构)。当然,只使用纯python编写一个好的递归下降解析器是可能的。嵌套的stuf不好。。。根据定义,正则表达式没有状态,因此无法匹配任意嵌套。。。但是你可以匹配这个。。但它会破坏其他任何东西…你应该使用适当的。。。这不是一种常规语言BTW@JBernardo-我不需要一个完整的解析器,我只需要整页中的一部分,我可以将其拆分为键/值对。@Justin808这就是为什么您需要一个解析器。正则表达式不能处理任意深度的语言。你可以让它在某些特定的情况下工作,但你不应该t@JBernardo-我想,但我不想使用完整的外部wiki解析器。我希望使用一个带有几个.splits()的正则表达式结果来获得我需要的结果。我正在尝试使用系统上预装的东西来实现这一点。。。。