Python非贪婪正则表达式

Python非贪婪正则表达式,python,regex,regex-greedy,Python,Regex,Regex Greedy,如何使类似于“(.*)”的python正则表达式这样,给定“a(b)c(d)e”python匹配“b”,而不是“b)c(d” 我知道我可以使用“[^)]”而不是“”,但我正在寻找一种更通用的解决方案,使我的正则表达式更干净。有没有办法告诉python“嘿,尽快匹配它”你在寻找全能的*? 从文件来看 非贪婪限定符*?,+?,?或{m,n}?[…]匹配得尽可能少 尽可能多的文本 \\(.*?\\)不起作用吗?这就是非贪婪语法 >>> x = "a (b) c (d) e" >

如何使类似于
“(.*)”的python正则表达式
这样,给定
“a(b)c(d)e”
python匹配
“b”
,而不是
“b)c(d”


我知道我可以使用
“[^)]”
而不是
”,但我正在寻找一种更通用的解决方案,使我的正则表达式更干净。有没有办法告诉python“嘿,尽快匹配它”

你在寻找全能的
*?

从文件来看

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

\\(.*?\\)
不起作用吗?这就是非贪婪语法

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

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

您希望它与“(b)”匹配吗?照齐特拉克斯和保罗的建议去做。你想让它和“b”匹配吗?做


使用ungreedy匹配是一个很好的开始,但我也建议您重新考虑使用
*
——这怎么办

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

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

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

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


也就是说,我会非常小心地使用
,因为它就像《世界卫生组织博士》中的声波螺丝刀一样,有一种倾向,如果没有仔细校准,我应该如何说它是“轻微的”不想要的东西。例如,要使用示例输入,它会将
((1)
(注意缺少第二个rparen)标识为匹配项。

根据Internet存档,指向的所有链接都是Python“re”的副本模块文档,所以Trey的链接也能正常工作。这个
*?
?通配符@Trevor Boyd smith这叫做“非贪婪”限定符。我尝试了另一个限定符,它总是非常贪婪:
>>重新搜索(\(.+?$),x).group()
'(b)c(d)e'
我期待最后一个但是它给出了第一个(到这行的末尾)。关于如何解释这一点,以及如何实现“最后一个(到这行的末尾)”有什么建议吗?
groups = re.search(r"\([^)]*\)", x)