我如何使一个python正则表达式像“(.*)”这样,给定“a (b) c (d) e”python匹配“b”而不是“b) c (d”?
我知道我可以使用“[^)]”而不是“.”,但我正在寻找一个更通用的解决方案,使我的正则表达式更干净一点。有没有办法告诉python“嘿,尽快匹配这个”?
我如何使一个python正则表达式像“(.*)”这样,给定“a (b) c (d) e”python匹配“b”而不是“b) c (d”?
我知道我可以使用“[^)]”而不是“.”,但我正在寻找一个更通用的解决方案,使我的正则表达式更干净一点。有没有办法告诉python“嘿,尽快匹配这个”?
当前回答
To start with, I do not suggest using "*" in regexes. Yes, I know, it is the most used multi-character delimiter, but it is nevertheless a bad idea. This is because, while it does match any amount of repetition for that character, "any" includes 0, which is usually something you want to throw a syntax error for, not accept. Instead, I suggest using the + sign, which matches any repetition of length > 1. What's more, from what I can see, you are dealing with fixed-length parenthesized expressions. As a result, you can probably use the {x, y} syntax to specifically specify the desired length.
然而,如果你真的需要非贪婪的重复,我建议咨询全能的?。当将它放在任何正则表达式重复说明符的末尾时,将强制正则表达式的这一部分查找尽可能少的文本。
话虽如此,我会非常小心?就像《神秘博士》里的音速螺丝刀一样,如果不仔细校准,就会倾向于做,怎么说呢,“略微”不受欢迎的事情。例如,要使用您的示例输入,它将标识((1)(注意缺少第二个rparen)作为匹配。
其他回答
>>> 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>'。
使用非贪婪匹配是一个好的开始,但我也建议你重新考虑使用。*——这个怎么样?
groups = re.search(r"\([^)]*\)", x)
就像其他人说的?*量词上的修饰符将解决您的直接问题,但要小心,您开始误入正则表达式停止工作的领域,您需要一个解析器。例如,字符串“(foo (bar)) baz”会给你带来问题。
你想和(b)匹配吗?按照Zitrax和Paolo的建议去做。你想让它和b匹配吗?做
>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'
\\(.*?\\)不行吗?这就是非贪婪语法。