我已在我的编程书中读到过。*?通常会使正则表达式不贪婪,而是匹配最短的匹配。
但是,它并没有按照以下要求运行:
正则表达式: http.*?500.jpg
测试字符串: http://google.com<img src="http://33.google.com/image/500.jpg
我想只匹配最短的,http://33.google.com/image/500.jpg
。
但它没有。它匹配整个字符串......
我已尝试阅读有关正则表达式的更多内容,但是,我还没有能够解决这个问题。
我怎样才能像这个例子一样选择最短的字符串匹配?
答案 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)