html="i have a litte tiny small jidsahoi nduashuip cat djsidjsuam kmidu9829jh caaaaaaaaatamsidosmio ct"
re.findall("ca*t",html)=?
這個的輸出結果很明顯,['cat', 'caaaaaaaaat',‘ct’]。*在正規表達式是0~20億,是以看頭尾,而中間的a是可以無窮多和0的。
re.findall("ca+t",html)=['cat', 'caaaaaaaaat'],+在正規表達式裡1~20億。這一點注意區分。
那這個re.findall(r"a[bcd]*b","abcbd")=?
那這個re.findall(r"a[bcd]*b","abcbd ab acdb abdb")=?
那這個re.findall(r"a[bcd]*b","abcbd ab acdb acb accccccb")=?
那這個re.findall(r"a(bcd)+b","abcdb ab acdb acb accccccb")=?
從上面幾個例子可以看得出,這是一種“貪婪比對”,[]以内的東西不是一個整體,僅僅是一個集合,裡面的元素隻要有就可以滿足,而沒有順序之分。
搭配這個例子,比較好消化:html="iponuhsk986789aeiou8n2n89aeiou8nfh72".
re.findall(r"[aeiou]",html),這個指令是搜尋語句裡符合a or e or i or o or u的詞,而不是尋找整個的aeiou。其結果是=['i', 'o', 'u', 'a', 'e', 'i', 'o', 'u', 'a', 'e', 'i', 'o', 'u']
而re.findall(r"(aeiou)",html)=['aeiou', 'aeiou']
同理一下的答案也應該能看明白了:
re.findall(r"(12)","12")=['12']
re.findall(r"(12)*","12")=?
re.findall(r"(12)*","12koko12kondu121212mlok")=?
====================================分割線======================================
?代表“制定前一個字元比對零次或者一次”,比如“一杯水?”,他可以比對“一杯水”和“一杯”,而無法比對“一杯水水”。
{m,n},這種代表重複m~n次,比如ab{2,4}c,可以比對abbc\abbbc\abbbbc,但是無法比對ac,abc,abbbbbc。這樣可見*={0,},+={1,},?={0,1}
具體例子如下:
re.findall(r"[a-z]","nuid8jiodmnasuieojmakm")
['n', 'u', 'i', 'd', 'j', 'i', 'o', 'd', 'm', 'n', 'a', 's', 'u', 'i', 'e', 'o', 'j', 'm', 'a', 'k', 'm']
>>> re.findall(r"[a,z]","nuid8jiodmnasuieojmakm")=['a', 'a']
>>> re.findall(r"a{2,3}","ab")=[]
>>> re.findall(r"a{2,3}","aaaab")=['aaa']
>>> re.findall(r"a{2,3}","aab")=['aa']
>>> re.findall(r"a{2-3}","aaaab")=[]
本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1731023