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','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','d','j','m','n','s','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,"aab")=['aa']
>>> re.findall(r"a{2-3}","aaaab")=[]