Python正则表达式:匹配括号/圆括号对

3
我想捕获相邻的括号对并获取其中的单词。在以下文本中,我想捕获[oh](so)[bad](things)
[oh](so)funny
[all]the[bad](things)

如果我使用正则表达式r'\[(.*?)\]\((.*?)\)',它会捕获[oh](so)[all]the[bad](things),这不是我想要的结果。
有什么好的正则表达式可以解决这个问题?

你也可以循环遍历你的分隔符对。此外,如果有人感兴趣,你的问题类似于这个问题:https://dev59.com/VHRB5IYBdhLWcg3wtJGF - tommy.carstensen
1个回答

8

不要使用.*?

改用[^\]]+[^\)]+

换句话说:

r'\[([^\]]+)\]\(([^\)]+)\)'


它能解决问题!但是在[some[good](text)]这种情况下仍然会失败。我只想捕获[good](text)。有什么办法也处理这种情况吗? - thameera
3
那不是你的问题的一部分。如果你需要更复杂的标签匹配,我建议使用某种解析模块。话虽如此,\[([^\]\[]+)\]\(([^\)]+)\)将正确地匹配你评论中的示例。 - Lone Shepherd
4
扩展Lone Shepherd所说的,正则表达式无法处理嵌套括号。你可以证明只包含平衡括号的语言是非正则的,即它不能被任何正则表达式匹配。Python regexen比正式的正则表达式更强大(像大多数现代实现一样,由于后向引用),但我认为它们没有必要的能力来识别更简单的语言,该语言包含所有形式为a...ab...b的字符串,其中有相等数量的as和bs。 - Antal Spector-Zabusky
1
@AntalS-Z:虽然您对Python库中的“re”是正确的,但更高级的正则表达式引擎(如Python Regex、PCRE、Net等)可以通过递归组(例如“(?R)”)来匹配嵌套括号和“a^n b^n”。 - georg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接