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

BBe*_*dit 3 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.

但事实并非如此.它匹配整个字符串......

我已经尝试过阅读有关正则表达式的更多内容,但是,我无法解决这个问题.

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

zx8*_*x81 5

我知道已经有两个答案,但有时候有另一种方法来看待它并处理它.

问题

当引擎位于第一个引擎之前时h,它会尽力匹配正则表达式http.*?500.jpg.那个正则表达式可以匹配吗?是的,它可以.匹配后http,引擎会保持懒惰匹配,直到遇到为止500.jpg.没有什么可以阻止的.你告诉它必须匹配尽可能多的字符,这就是它正在做的事情.

相反,假设你有两个这个字符串 500.jpg

http://google.com<img src="http://google.com/500.jpg 1500.jpg 
                                                    ^ lazy .*? stops here
                                                             ^ greedy .* stops here
Run Code Online (Sandbox Code Playgroud)

贪婪的人将匹配整个字符串.但懒惰的人会尽快停止:和以前一样.在这里你可以看到贪婪和懒惰之间的区别.

解决方法:不要使用Dot-Star-使用正确的令牌

假设您知道每个http字符串后面都有空格或换行符.你可以使用一个懒惰的匹配http\S*?\.jpg点是,\S*匹配任何不是"空白字符"(换行符,标签等)的字符都不能跳过空格,不像点星.

参考

此外,我强烈建议您阅读下面的文章,因为它应该有助于任何剩余的混乱.

多层正则表达式贪婪