Python正则表达式或|是贪婪的

Python正则表达式或|是贪婪的,python,regex,Python,Regex,python文档2.7说or运算符“|”从不贪婪。但我的代码一直工作不好。我希望正则表达式在到达下一个时停止搜索&而是遍历整个字符串。您的正则表达式尝试匹配所有内容。*,然后当它到达字符串末尾时,它开始回溯,直到匹配&。这就是为什么你会得到这样的结果 将正则表达式更改为 >>> import re >>> p = re.compile('.*&l=(.*)(&|$)') >>> p.search('foo&l=some

python文档2.7说or运算符“|”从不贪婪。但我的代码一直工作不好。我希望正则表达式在到达下一个时停止搜索&而是遍历整个字符串。

您的正则表达式尝试匹配所有内容。*,然后当它到达字符串末尾时,它开始回溯,直到匹配&。这就是为什么你会得到这样的结果

将正则表达式更改为

>>> import re
>>> p = re.compile('.*&l=(.*)(&|$)')
>>> p.search('foo&l=something here&bleh').group(1)
'something here&bleh' # want to remove strings after &
>>> p.search('foo&l=something here').group(1)
'something here' # this is OK
添加?会让你的正则表达式变懒

演示该问题的简单示例:

假设您希望匹配所有内容,直到出现第一个%字符,并假设您编写以下正则表达式:

.*&l=(.*?)(&|$)
让我们看看给定字符串abc%def%g时引擎是如何工作的


它首先看到。*,将尝试使用所有内容,因此它将匹配整个字符串。但是,它尝试匹配%但失败了,因此它返回到前一个字符,它是g,仍然不匹配。将再次回溯,然后它达到%,它确实匹配!因此,您将得到abc%def%。

您的正则表达式尝试匹配所有内容。*,然后当它到达字符串末尾时,它开始回溯,直到匹配&。这就是为什么你会得到这样的结果

将正则表达式更改为

>>> import re
>>> p = re.compile('.*&l=(.*)(&|$)')
>>> p.search('foo&l=something here&bleh').group(1)
'something here&bleh' # want to remove strings after &
>>> p.search('foo&l=something here').group(1)
'something here' # this is OK
添加?会让你的正则表达式变懒

演示该问题的简单示例:

假设您希望匹配所有内容,直到出现第一个%字符,并假设您编写以下正则表达式:

.*&l=(.*?)(&|$)
让我们看看给定字符串abc%def%g时引擎是如何工作的

它首先看到。*,将尝试使用所有内容,因此它将匹配整个字符串。但是,它尝试匹配%但失败了,因此它返回到前一个字符,它是g,仍然不匹配。将再次回溯,然后它达到%,它确实匹配!因此,您将获得abc%def%。

您需要更改。*在第一个捕获组中,更改为[^&]*

您的正则表达式p=re.compile.*&l=.*&$'也匹配额外的字符,因为第一个捕获组中的。*是贪婪的,它匹配到最后一个的所有字符。大家都知道$与最后一个存在的边界相匹配。因此找到了匹配项

所以,.*然后,$会找到匹配项,这样它就不会被回退。

您需要更改。*在第一个捕获组中,[^&]*

您的正则表达式p=re.compile.*&l=.*&$'也匹配额外的字符,因为第一个捕获组中的。*是贪婪的,它匹配到最后一个的所有字符。大家都知道$与最后一个存在的边界相匹配。因此找到了匹配项

所以,.*然后$找到一个匹配项,这样它就不会回来了