Python非贪婪正则表达式


150

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

我知道我可以使用"[^)]"代替".",但是我正在寻找一种更通用的解决方案,使我的regex更加整洁。有什么办法告诉python“嘿,尽快匹配它”?

Answers:


207

您寻求无所不能 *?

从文档来看,贪婪与非贪婪

非贪心预选赛*?+???,或{m,n}?[...]匹配的 文本越好。


根据Internet Archive的资料,指向的所有链接都是Python“ re”模块文档的副本,因此Trey的链接也能正常工作。
spiffytech

2
这个的通用英文名字是*?什么?
Trevor Boyd Smith

通配符@Trevor Boyd Smith
Serge

3
这就是所谓的“非贪婪”限定词
brunetton

65
>>> 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>”。


14

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


5

正如其他人所说的那样使用?*修饰符上的修饰符将解决您的迫在眉睫的问题,但请注意,您开始误入正则表达式停止工作的区域,而需要解析器。例如,字符串“(foo(bar))baz”会给您带来麻烦。


5

使用不匹配的比赛是一个不错的开始,但是我还建议您重新考虑对它的任何使用.*-这怎么办?

groups = re.search(r"\([^)]*\)", x)

3

是否要与“(b)”匹配?按照Zitrax和Paolo的建议做。您要它匹配“ b”吗?做

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

0

首先,我不建议在正则表达式中使用“ *”。是的,我知道,它是最常用的多字符定界符,但它不是一个好主意。这是因为,尽管它确实匹配该字符的任何重复量,但“ any”仍包含0,这通常是您要为其抛出语法错误而不是接受的东西。相反,我建议使用+与长度> 1的任何重复匹配的符号。此外,从我所看到的来看,您正在处理定长括号括起来的表达式。结果,您可能可以使用{x, y}语法来专门指定所需的长度。

但是,如果您确实需要非贪婪的重复,我建议您咨询无所不能的?。将其放置在任何正则表达式重复说明符的末尾时,将强制正则表达式的该部分查找尽可能少的文本。

话虽这么说,但我会非常小心?,就像Who博士中的Sonic螺丝起子有这样做的倾向,如果不仔细校准,我应该如何将它“稍微”变坏。例如,要使用示例输入,它将识别((1)(注意缺少第二个rparen)作为匹配项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.