如何使正则表达式匹配非贪心?

时间:2014-06-13 22:08:34

标签: regex python-2.7

我已在我的编程书中读到过。*?通常会使正则表达式不贪婪,而是匹配最短的匹配。

但是,它并没有按照以下要求运行:

正则表达式: http.*?500.jpg

测试字符串: http://google.com<img src="http://33.google.com/image/500.jpg

我想只匹配最短的,http://33.google.com/image/500.jpg

但它没有。它匹配整个字符串......

我已尝试阅读有关正则表达式的更多内容,但是,我还没有能够解决这个问题。

我怎样才能像这个例子一样选择最短的字符串匹配?

3 个答案:

答案 0 :(得分:0)

正则表达式引擎从左到右逐个字符处理字符串。因此,当找到第一个http时,正则表达式引擎尝试使用尽可能少的字符使模式成功,但是从当前位置 <(>)(换句话说:尽快在字符串)。

使用您的示例,为了确保匹配以500.jpg结尾的网址,您可以帮助正则表达式引擎找到您想要的更多信息,例如:

\bhttp://\S+/500\.jpg\b

添加了信息:

  • 使用字边界\b
  • http://更明确
  • \S+使用网址中没有空格的事实(空格通常转换为%20
  • 文件名前的斜杠

注意:正如您所看到的,当您在模式中添加更多信息时,您会发现有时懒惰的量词是无用的。

这只是一个适合你的摘录的例子。你需要根据自己的情况调整它。 (想象一个包含以逗号分隔的网址的字符串,在这种情况下,您应该将\S替换为[^\s,]

答案 1 :(得分:0)

http尽早匹配,然后.*?匹配尽可能少,为您提供超过必要的字符串。

您可以通过在其前添加贪婪的http来尽可能确保.*匹配:

import re
str = 'http://google.com<img src="http://33.google.com/image/500.jpg'
re.match('.*(http.*?500.jpg)', str).groups()[0]

答案 2 :(得分:0)

import re
str = 'http://google.com<img src="http://33.google.com/image/500.jpg'

#by using findall() function...
exact_url=re.findall(r"^http:.*?(http://.*/500.jpg)$",str)[0]

#by using match() function...
exact_url=re.match(r"^http:.*(http://.*)$",str).group(1)