python re模塊還是需要重新學(xué)習(xí)。
python readline 和 readlines(), readline() , read() 3者之間的區(qū)分,之前1直都不清楚,現(xiàn)在弄清楚是怎樣回事了。
readlines() 可以1起顯示出全部文件,這個(gè)也是迭代顯示的,需要追行顯示,迭代器的指針會(huì)被消耗的。
python 中的正則是匹配換行之外的所有的字符。.* 是匹配不了所有的字符的。在某些情況下,我的結(jié)論是正確的,但是在某些情況下,我的結(jié)論又是毛病的。剛才遇到的問(wèn)題,現(xiàn)在終究知道是怎樣回事了,原來(lái)是貪婪匹配和非貪婪匹配的問(wèn)題,對(duì)這類情況,我也是相對(duì)遲鈍了。
save.html 是我隨意抓來(lái)的1個(gè)html,我要從這個(gè)html中抓出所有的 javascript代碼段。
def getcss():
fh = open('save.html')
html =fh.read()
#js_pattern = re.compile(r'<script .*?">');
ans = re.findall(r'<script .*?>.*?</script>',html,re.S)
src_pattern = re.compile(r'^"http.*"');
for i in ans:
#ret = re.findall(src_pattern,i)
print i
通過(guò)上面的程序,我得到了下面的結(jié)果。源文件是1個(gè)html,格式1般,這些代碼段是分行的,我的目的是找出所有的代碼段。下面做1個(gè)簡(jiǎn)單的解釋。在嘗試的進(jìn)程中,我試了好幾種正則表達(dá)式,下面講1下我遇到的問(wèn)題。
實(shí)現(xiàn)是跨行匹配的問(wèn)題,.*是沒(méi)法匹配
的,所以如果標(biāo)簽散布在不同的行,那末如何匹配中間的內(nèi)容呢。為了解決跨行匹配的問(wèn)題,找到了這個(gè)解決方案,可以用([dD]*)或([wW]*) 或([sS]*) 來(lái)代替。
然后又遇到了問(wèn)題,我的正則總是會(huì)匹配太多的內(nèi)容,最后發(fā)現(xiàn),我的匹配模式是依照最多內(nèi)容匹配的。默許的匹配模式是貪婪匹配,所以如果用了.*的話,總會(huì)匹配更多的內(nèi)容。所以找到了這個(gè)參考。python貪婪匹配看到了貪婪匹配和非貪婪匹配的核心在1個(gè)?上,re.S標(biāo)記是多行匹配的關(guān)鍵,類似的標(biāo)記還有re.M標(biāo)記,這個(gè)是1行的標(biāo)記。re.M:^$標(biāo)志將會(huì)匹配每行,默許^和$只會(huì)匹配第1行,文章里有幾個(gè)例子還是很不錯(cuò)的,值得仔細(xì)研究1下,建議自己履行1下這些代碼,看下結(jié)果,如果這些都很清楚,那末正則掌握的還算不錯(cuò)。
re.findall(r"a(d+?)", "a23b")
re.findall(r"a(d+)", "a23b")
re.findall(r"a(d+)b.+a(d+)b", "a23b
a34b")
re.findall(r"a(d+)b.+a(d+)b", "a23b
a34b", re.S)
最后,實(shí)現(xiàn)了上面我提出的需求,主要利用了跨行匹配和非貪婪匹配。