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{}对的数量可以是无限制的。嵌套是正则表达式不擅长的事情。您最多可以硬编码特定数量的嵌套以支持,但没有通用的解决方案。但是您没有嵌套{{},因此给定的正则表达式将用于您的示例输入。