Python 非贪婪正则表达式

264 投票
7 回答
171492 浏览
提问于 2025-04-15 11:10

我想知道如何写一个Python的正则表达式,比如 "(.*)",让它在给定字符串 "a (b) c (d) e" 时,能够匹配到 "b",而不是 "b) c (d"

我知道可以用 "[^)]" 来替代 ".",但我希望找到一个更通用的解决方案,这样我的正则表达式看起来会更简洁。有没有办法告诉Python“嘿,尽快匹配这个”呢?

7 个回答

17

难道 \\(.*?\\) 不可以用吗?这是一个非贪婪的写法。

92
>>> x = "a (b) c (d) e"
>>> re.search(r"\(.*\)", x).group()
'(b) c (d)'
>>> re.search(r"\(.*?\)", x).group()
'(b)'

根据文档的说明:

在正则表达式中,'*'、'+'和'?'这些符号都是贪婪的,它们会尽量匹配尽可能多的文本。有时候,这种行为并不是我们想要的。例如,如果我们用正则表达式 <.*> 去匹配字符串 '<H1>title</H1>',它会匹配整个字符串,而不仅仅是 '<H1>'。如果在这些符号后面加上 '?',就会让它们以非贪婪的方式进行匹配,也就是说,它们会尽量少匹配字符。使用 .*? 在之前的表达式中,就只会匹配到 '<H1>'。

386

你在寻找强大的 *?

根据文档,贪婪模式与非贪婪模式

非贪婪的修饰符 *?+???{m,n}? [...] 会尽量匹配最少的文本。

撰写回答