Python非贪婪的正则expression式
如何让一个python正则expression式像“(。*)”这样,因为“a(b)c(d)e”python匹配“b”而不是“b)c(d”?
我知道我可以使用“[^)]”而不是“。”,但我正在寻找一个更一般的解决scheme,使我的正则expression式更清洁。 有什么办法可以告诉python“嘿,尽快配对”?
>>> x = "a (b) c (d) e" >>> re.search(r"\(.*\)", x).group() '(b) c (d)' >>> re.search(r"\(.*?\)", x).group() '(b)'
根据文件 :
'
*
','+
'和'?
“预选赛都是贪婪的, 他们匹配尽可能多的文字。 有时这种行为是不希望的; 如果RE<.*>
与<H1>title</H1>
匹配,它将匹配整个string,而不仅仅是“<H1>
”。 添加'?
在资格赛之后,他们以非贪婪的方式进行比赛; 尽可能less的字符将被匹配。 使用.*?
在前面的expression式中只会匹配'<H1>
'。
不会\\(.*?\\)
工作? 这是非贪婪的语法。
正如其他人所说的使用? *量词修饰符将解决您的直接问题,但要小心,你开始偏离正则expression式停止工作的领域,而你需要一个parsing器。 例如,string“(foo(bar))baz”会导致你的问题。
你想让它匹配“(b)”吗? 照Zitrax和Paolo的build议。 你想要它匹配“B”吗? 做
>>> x = "a (b) c (d) e" >>> re.search(r"\((.*?)\)", x).group(1) 'b'
使用非正式比赛是一个好的开始,但是我也build议你重新考虑使用.*
– 这个怎么样?
groups = re.search(r"\([^)]*\)", x)