python贪婪匹配
‘壹’ python 正则表达式 非贪婪匹配问题
tim@tim-1215B:~$ python
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Type "help", "right", "credits" or "license" for more information.
>>> import re
>>> data = 'Thu Feb 15 17:46:04 2007::[email protected]:: 2341123-6-8'
>>> patt = re.compile(r'.+(\d+-\d-\d)', re.X)
>>> print patt.match(data).group(1)
3-6-8
>>> patt = re.compile(r'.+?(\d+-\d-\d)', re.X)
>>> print patt.match(data).group(1)
2341123-6-8
>>>
‘贰’ 想请教python 正则表达式
这你就需要了解正则表达式的贪婪匹配和非贪婪匹配
在此例中
#.*是贪婪匹配模式,所谓贪婪匹配就是在整个表达式匹配成功的前提下,尽可能多的匹配,
#也就是所谓的“贪婪”,通俗点讲,就是看到想要的,有多少就捡多少,除非再也没有想要的了。
#.*?是非贪婪模式,所谓非贪婪模式就是在整个表达式匹配成功的前提下,尽可能少的匹配,
#也就是所谓的“非贪婪”,通俗点讲,就是找到一个想要的捡起来就行了,
#至于还有没有没捡的就不管了
#举个例子
#字符串"abcdccd"
#那么"a.*"匹配的是"abcdccd",贪婪模式,从a开始的我都要了
#"a.*?"匹配的是"a",非贪婪模式,满足条件的情况下,我只要a就行了
#"a.*?d"匹配的是"abcd",非贪婪模式,我只要从a开始最快到d的字符串就行了
#"a.*d"匹配的是"abcdccd",贪婪模式,我只要从a开始,到最远d的就可以了
不知道这样讲解时否明白
‘叁’ 求大神帮忙看看python这个问题
首先,仅从你的正则就能看出来,它肯定不会精确匹配你想要的内容,因为正则默认是贪婪捕获的,所以,你可以按以下方式进行匹配:
importre
#以下内容我已经用你给的网站测试过,是可以正常匹配的
#如果有什么其他需要,在追问
IMG=re.compile('"http:[^]+.jpg?"')
imglist=re.findall(IMG,html)#假设html是你下载的网页内容
#看你的download函数似乎不是很健全,贴个我的函数(模拟浏览器提交数据,
#可防止网站屏蔽,经常使用,目前挺稳定)
importtime
importsocket
importurlparse
importurllib2
defdowload(url,trynum=2):
print'Downloading:',url
user_agent='Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.11(KHTML,likeGecko)Chrome/23.0.1271.64Safari/537.11'
headers={'User-agent':user_agent}
request=urllib2.Request(url,headers=headers)
try:
html=urllib2.urlopen(request,timeout=10).read()
except(urllib2.URLError,socket.timeout):
html=None
iftrynum>0:
time.sleep(5)
returndowload(url,trynum-1)
ifnothtml:
print'Erro:Failedtodownloadtheurl:%s'%(url)
returnhtml
‘肆’ Python 正则表达式 非贪婪匹配问题
第二捕获括号里面是 (0*) ——0个或多个0, 后面接着是$——行尾,
02300——不满足多个0.
正则表达式改为:
^(\d+?)(0.*)$
结果就会是:
("1", "02300")
‘伍’ 关于python正则表达式的贪婪模式和懒惰模式
因为你后面加了.jpg,那么它一直要匹配到末尾,所以结果是一样的
举个例子
字符串"abcd"
那么"a.*"匹配的是"abcd"
"a.*?"匹配的是"a"
"a.*?d"匹配的是"abcd"
"a.*d"匹配的是"abcd"
‘陆’ python re :的意思
不捕获分组的意思,整个正则表达式的意思是abc的至少一次的组合(+是贪婪匹配,尽量多组,题目中结果共9个字母)。如果不加?:则所有abc(3个字母)都被放在结果里。
‘柒’ python 正则表达式 (.*)
groups()返回所有捕获组构成的tuple。你的正则表达式中有唯一一个捕获组(.*?),而?在此处表示非贪婪匹配,即在整个正则表达式成立的前提下匹配尽可能少的字符,此处最少的情况是什么也不匹配,整个正则表达式匹配Python中的Py,而捕获组自然为空字符串。
‘捌’ (python语言)为什么正则表达式的 贪婪匹配模式 比 非贪婪模式 得到的匹配结果还要短
不清楚你的贪婪模式的正则是怎么的:.*(a.*?a).* or .*?(a.*a).* or .*(a.*a).*
你给的例子匹配并没有问题
.*? 匹配的空
a.*?a 匹配的aqwertya
.* 匹配的aple
你可以试试给每段正则都加个分组然后打印每个分组的匹配结果,然后修改正则为贪婪和非贪婪分别看看结果。这样有助于你理解学习。
str='aqwertyaaple'
regex_str='(.*?)(a.*?a)(.*)'
match_obj=re.match(regex_str,str)
match_obj.group(1)
match_obj.group(2)
match_obj.group(3)
‘玖’ 在PYTHON中如何匹配一个存在多个相同的正则表达式模式的字符串中的所有正则表达式模式
你的正则表达式使用了贪婪模式的匹配(.*),应该用非贪婪模式,正则表达式应该为<a href="/(.*?)-desktop-wallpapers.html
完整的python语言程序如下
#!/usr/bin/python3 import re a = '<html><body><p>[<a href="/aero-desktop-wallpapers.html" title="Aero HD Wallpapers">Aero</a>, <a href="/animals-desktop-wallpapers.html" title="Animals HD Wallpapers">Animals</a>, <a href="/architecture-desktop-wallpapers.html" title="Architecture HD Wallpapers">Architecture</a>,Wallpapers">Artistic</a>, ........(省略)......... <a href="/vintage-desktop-wallpapers.html" title="Vintage HD Wallpapers">Vintage</a>]</p></body></html>'titles = re.findall('<a href="/(.*?)-desktop-wallpapers.html',str(a))print (titles) 运行结果['aero', 'animals', 'architecture', 'vintage']