Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Mediawiki Templates - Fatal编程技术网

Python 如何使用正则表达式获取特定的嵌套块内容

Python 如何使用正则表达式获取特定的嵌套块内容,python,regex,mediawiki-templates,Python,Regex,Mediawiki Templates,我想从维基百科中提取信息框块。下面是一个示例输入文件: {{some text}} some other text {{Infobox President birth|d/m/y other_inner_text:{{may contain curly bracket}} other text}} some other text or even another infobox {{Infobox Cabinet same structure {{text}}also can contain {{

我想从维基百科中提取信息框块。下面是一个示例输入文件:

{{some text}}
some other text
{{Infobox President
birth|d/m/y
other_inner_text:{{may contain curly bracket}}
other text}}
some other text
or even another infobox
{{Infobox Cabinet
same structure
{{text}}also can contain {{}}
}}
can be some other text...
我希望解析结果返回两个Infobox块:

{{Infobox President
birth|d/m/y
other_inner_text:{{may contain curly bracket}}
other text
}}

有人知道如何在python中使用正则表达式来实现这一点吗

它不是python,但可能对您有所帮助。它甚至包括一个不快速但脏的正则表达式,可以处理一级嵌套模板

一般的答案是否定的,正则表达式不能解析嵌套结构。有关如何从mediawiki api获取parsetree的链接答案,请参见。

这不是python,但可能会对您有所帮助。它甚至包括一个不快速但脏的正则表达式,可以处理一级嵌套模板

一般的答案是否定的,正则表达式不能解析嵌套结构。有关如何从mediawiki api获取parsetree,请参阅链接答案。

Regex

{{Infobox(?:(?!}}|{{).)*(?:{{(?:(?!}}|{{).)*}}(?:(?!}}|{{).)*)*.*?}}
还有我在Perl上的尝试,我不太熟练

while ($subject =~ m/\{\{Infobox(?:(?!\}\}|\{\{).)*(?:\{\{(?:(?!\}\}|\{\{).)*\}\}(?:(?!\}\}|\{\{).)*)*.*?\}\}/sg) {
    # matched text = $&
}
它将在无限对{{some text}}上工作,只要它们是平衡的。它不支持该对的嵌套文本,但不是必需的

请注意,如果不是在一次性解决方案中使用,则最好寻找替代解决方案。维护这样的正则表达式是残酷的。

regex

{{Infobox(?:(?!}}|{{).)*(?:{{(?:(?!}}|{{).)*}}(?:(?!}}|{{).)*)*.*?}}
还有我在Perl上的尝试,我不太熟练

while ($subject =~ m/\{\{Infobox(?:(?!\}\}|\{\{).)*(?:\{\{(?:(?!\}\}|\{\{).)*\}\}(?:(?!\}\}|\{\{).)*)*.*?\}\}/sg) {
    # matched text = $&
}
它将在无限对{{some text}}上工作,只要它们是平衡的。它不支持该对的嵌套文本,但不是必需的


请注意,如果不是在一次性解决方案中使用,则最好寻找替代解决方案。维护这样的正则表达式是很残酷的。

为了匹配嵌套结构,一些正则表达式方言提供了诸如?R之类的递归模式。基本上?R表示这个表达式匹配的内容

标准python re不支持这一点,但最终将取代re的较新模块支持这一点。这里有一个完整的例子

text = """
{{some text}}
some other text
{{Infobox President
birth|d/m/y
other_inner_text:{{may contain {curly} bracket}}
other text}}
some other text
or even another infobox
{{Infobox Cabinet
same structure
{{text}}also can contain {{}}
}}
can be some other text...
"""

import regex

rx = r"""
{{                    # open
(                     # this match
    (?:               # contains...
        [^{}]         # no brackets
        |             # or
        }[^}]         # single close bracket
        |             # or
        {[^{]         # single open bracket
        |             # or
        (?R)          # the whole expression once again <-- recursion!
    )*                # zero or more times
)                     # end of match
}}                    # close
"""

rx = regex.compile(rx, regex.X | regex.S)

for p in rx.findall(text):
    print 'FOUND: (((', p, ')))'
有关递归正则表达式的详细解释,请参见

忍不住偷了这个


也就是说,使用基于解析器的解决方案可能会更好。请参阅示例。

为了匹配嵌套结构,一些regexp方言提供了诸如?R之类的递归模式。基本上?R表示该表达式匹配的内容

标准python re不支持这一点,但最终将取代re的较新模块支持这一点。这里有一个完整的例子

text = """
{{some text}}
some other text
{{Infobox President
birth|d/m/y
other_inner_text:{{may contain {curly} bracket}}
other text}}
some other text
or even another infobox
{{Infobox Cabinet
same structure
{{text}}also can contain {{}}
}}
can be some other text...
"""

import regex

rx = r"""
{{                    # open
(                     # this match
    (?:               # contains...
        [^{}]         # no brackets
        |             # or
        }[^}]         # single close bracket
        |             # or
        {[^{]         # single open bracket
        |             # or
        (?R)          # the whole expression once again <-- recursion!
    )*                # zero or more times
)                     # end of match
}}                    # close
"""

rx = regex.compile(rx, regex.X | regex.S)

for p in rx.findall(text):
    print 'FOUND: (((', p, ')))'
有关递归正则表达式的详细解释,请参见

忍不住偷了这个


也就是说,使用基于解析器的解决方案可能会更好。请参阅示例。

要求使用嵌套结构使正则表达式成为此作业的错误工具。这可能会有所帮助-要求使用嵌套结构使正则表达式成为此作业的错误工具。这可能会有所帮助-@Rudie完全同意。除非它是一段一次性代码,否则不要使用它。我同意你和其他对此问题的评论,因为嵌套的情况很难处理。谢谢这个临时正则表达式,如果你能想出一个无限制的版本,那对包括我在内的人来说将是非常有教育意义的。@Peiti Peter Li{}对的数量可以是无限制的。嵌套是正则表达式不擅长的事情。您最多可以硬编码特定数量的嵌套以支持,但没有通用的解决方案。但是您没有嵌套您的{{},因此给定的正则表达式将用于您的示例输入。@Rudie完全同意。除非它是一段一次性代码,否则不要使用它。我同意你和其他对此问题的评论,因为嵌套的情况很难处理。谢谢这个临时正则表达式,如果你能想出一个无限制的版本,那对包括我在内的人来说将是非常有教育意义的。@Peiti Peter Li{}对的数量可以是无限制的。嵌套是正则表达式不擅长的事情。您最多可以硬编码特定数量的嵌套以支持,但没有通用的解决方案。但是您没有嵌套{{},因此给定的正则表达式将用于您的示例输入。