【发布时间】:2016-09-02 22:01:37
【问题描述】:
我在 python 中做一个非常简单的正则表达式,当我使用“或”运算符时看到一些奇怪的行为。
我正在尝试解析以下内容:
>> str = "blah [in brackets] stuff"
让它返回:
>> ['blah', 'in brackets', 'stuff']
为了匹配括号之间的文本,我使用了向后看和向前看,即:
>> '(?<=\[).*?(?=\])'
如果单独使用,它确实会捕获括号中的文本:
>> re.findall( '(?<=\[).*?(?=\])' , str )
>> ['in brackets']
但是当我结合 or 运算符来解析空格之间的字符串时,括号匹配会以某种方式分解:
>> [x for x in re.findall( '(?<=\[).*?(?=\])|.*?[, ]' , str ) if x!=' ' ]
>> ['blah', '[in ', 'brackets] ']
对于我的生活,我无法理解这种行为。任何帮助将不胜感激。
谢谢!
【问题讨论】:
-
这可能会有所帮助 - regex101.com/r/xM7sK0/1 - 在左侧,您可以进入调试器,它将解释它如何匹配它所做的事情。
-
谢谢,真的很有用。
-
问题是正则表达式的第二半也匹配括号。在第一个匹配(“blah”)之后,剩余的文本是
[in brackets] stuff。正则表达式的前半部分在此处不匹配,因为向后查找没有找到左括号。所以正则表达式的第二部分再次匹配并找到文本“[in”。 -
啊,我明白了。谢谢你!
标签: python regex match findall