re.compile.findall原理是理解了,但輸出不大理解(主要是加了正則表達式的括號分組)
一開始不懂括號的分組及捕捉,看了網上這個例子(如下),然而好像還是說不清楚這個括號的規律(還是說我沒找到或是我理解能力太差),還是看不出括號的規律,於是更多的嘗試(第二張大圖),並最后總結規律。
下圖是為了嘗試出括號分組的規律,下面是總結
就從最后一次匹配說起吧
分析:首先是匹配的順序,分析某個括號時,暫時去掉其它括號,易讀
第一步,先對整個‘ ’內的規則作出匹配,整體匹配,先去括號(易讀),即先從s中匹配出第一個【\w+\w+\s+\w+\s+\w+】(去括號的樣子),但由於沒有括號將這個整體擴上,所以沒有捕捉(即不用輸出),第一個匹配到的大字符串是“qew rty uio”
【可以這樣一個個對應】
\w+ \w+ \s+ \w+ \s+ \w+
| | | | | |
qe w rty uio
對應圖
第二步,匹配到的字符串再進行匹配捕捉,即輸出,現在從左往右,一個個左括號捕捉起,第一個左括號【(\w+\w+\s+\w+)】(暫時去掉了嵌套在中間的左括號,易讀),則匹配到上面字符串中(“qew rty uio”)的"qew rty"(可對照上面的對應圖),由於是括號內,所以捕捉(即輸出)
第三步,第二個括號,\w+(\w+)\s+\w+(暫時去掉其它括號) 匹配上一括號中的字符串(“qew rty”),即是匹配到‘w’(可對照上面的對應圖),由於是括號內,所以捕捉(即輸出)
第四步,第三個括號,\w+\w+\s+\w+(\s+\w+)(暫時去掉其他括號)匹配並輸出第一步中的字符串,即是“uio”
總結:
1、首先全部去括號的匹配,畫出對應圖,這樣很清晰,然后看括號內的即捕捉輸出,然后在匹配的文本(s)再尋找下一個匹配的大字符串,一直找下去……
2、去括號是為了清晰的分析,主要注意從第一個左括號開始分析起
3、如果是嵌套括號,如(((a)b)(c)d),若要捕捉a括號的字符,則先需要匹配最外面的括號,然后在慢慢往里面匹配,即是先匹配出d括號的內容,再在d括號里面匹配出b括號的內容,再在b括號中匹配出a括號的內容,然后所有括號里的,輸出,按左邊第一個括號所匹配的字符串排列:(d,b,a,c)
如有錯誤,麻煩及時指正,謝謝!