207

"(.*)"给定"a (b) c (d) e"python 匹配"b"而不是 ,如何制作这样的 python 正则表达式"b) c (d"

我知道我可以使用"[^)]"而不是".",但我正在寻找一个更通用的解决方案,让我的正则表达式更简洁。有没有办法告诉python“嘿,尽快匹配这个”?

4

7 回答 7

303

你寻求全能者*?

来自文档,贪婪与非贪婪

非贪婪限定符*?, +?, ??, 或{m,n}?[...] 匹配尽可能少的 文本。

于 2009-04-19T23:27:21.917 回答
77
>>> x = "a (b) c (d) e"
>>> re.search(r"\(.*\)", x).group()
'(b) c (d)'
>>> re.search(r"\(.*?\)", x).group()
'(b)'

根据文档

' *'、' +' 和 ' ?' 限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不希望的;如果 RE<.*>与 ' <H1>title</H1>' 匹配,它将匹配整个字符串,而不仅仅是 ' <H1>'。在限定符之后添加 ' ?' 使其以非贪婪或最小方式执行匹配;将匹配尽可能少的字符。.*?在前面的表达式中使用将只匹配 ' <H1>'。

于 2009-04-19T23:31:33.343 回答
16

行不通\\(.*?\\)?那是非贪婪的语法。

于 2009-04-19T23:28:04.240 回答
7

使用不贪婪的匹配是一个好的开始,但我也建议您重新考虑使用.*-- 这个怎么样?

groups = re.search(r"\([^)]*\)", x)
于 2009-04-21T18:01:15.117 回答
6

你想让它匹配“(b)”吗?按照 Zitrax 和 Paolo 的建议去做。你想让它匹配“b”吗?做

>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'
于 2009-04-19T23:54:55.907 回答
6

正如其他人所说,使用 ? * 量词上的修饰符将解决您的直接问题,但要小心,您开始误入正则表达式停止工作的区域,而您需要一个解析器。例如,字符串 "(foo (bar)) baz" 会给你带来麻烦。

于 2009-04-21T18:06:23.437 回答
0

首先,我不建议在正则表达式中使用“*”。是的,我知道,它是最常用的多字符分隔符,但它仍然是个坏主意。这是因为,虽然它确实匹配该字符的任何重复次数,但“任何”包含 0,这通常是您想要抛出语法错误而不是接受的东西。相反,我建议使用+与长度 > 1 的任何重复匹配的符号。此外,据我所知,您正在处理固定长度的括号表达式。因此,您可能可以使用{x, y}语法来专门指定所需的长度。

但是,如果你真的需要非贪婪的重复,我建议咨询全能的?. 这,当放置在任何正则表达式重复说明符的末尾时,将强制正则表达式的该部分找到尽可能少的文本。

话虽这么说,我会非常小心?,就像 Dr. Who 中的 Sonic 螺丝刀一样,如果不仔细校准,我应该怎么说,“有点”不受欢迎的东西。例如,要使用您的示例输入,它会将((1)(注意缺少第二个 rparen)标识为匹配项。

于 2019-10-26T11:38:48.720 回答