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']