先引入一下百度百科對於正則表達式的概念:
正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。
然后我們來引入一下貪婪算法與非貪婪算法的一個概念:
貪婪算法:
貪婪匹配(默認的):在整個表達式匹配成功的前提下,盡可能多的匹配
表達方式: .* .+ .? ·······
非貪婪算法:
貪婪匹配:在整個表達式匹配成功的前提下,盡可能少的匹配
表達方式: .* ? .+? .?? ·······
當然我們通過代碼也可以看出來
import re html = """ <html> <div><p>九霄龍吟驚天變</p></div> <div><p>風雲際會淺水游</p></div> </html> """ #貪婪匹配 pattern = re.compile('<div><p>.*</p></div>',re.S) #表達式為: .* r_list = pattern.findall(html) print(r_list) #非貪婪匹配 pattern = re.compile('<div><p>.*?</p></div>',re.S) #表達式為: .*? r_list = pattern.findall(html) print(r_list)
我們可以通過輸出結果看出來兩者的區別
['<div><p>九霄龍吟驚天變</p></div>\n <div><p>風雲際會淺水游</p></div>'] #將 \n換行 空格 全部匹配了下來
['<div><p>九霄龍吟驚天變</p></div>', '<div><p>風雲際會淺水游</p></div>'] #只是將 兩個div中的內容匹配了下來
可以看出 貪婪算法會在字符串中會找到第一個匹配的元素后就會一直尋找到最后一個匹配的元素 即使中間有重復匹配的元素的元素
非貪婪算法會盡可能的少匹配,即為只要滿足就會結束,從而尋找下一組匹配的元素
正則算法子模式的應用
如上代碼 如果我想要將 九霄龍吟驚天變 風雲際會淺水游 這兩句詩單獨提取出來 就要單獨修改代碼
pattern = re.compile('<div><p>(.*?)</p></div>',re.S) #表達式為: (.*?) r_list = pattern.findall(html) print(r_list)
即為:在需要單獨提取出來的元素兩邊加上() 運行結果為:
['九霄龍吟驚天變', '風雲際會淺水游']
下面我們可以進行一些其他的測試 從而更加直觀的看到 正則表達式子模式的應用
\w:單次或多次出現的字符 \s:空白字符
s = 'A B C D' p1 = re.compile('\w+\s+\w+') print(p1.findall(s))
結果為:
['A B','C D']
s = 'A B C D' p1 = re.compile('(\w)+\s+\w+') print(p1.findall(s))
結果為:
['A','C']
s = 'A B C D' p1 = re.compile('(\w)+\s+(\w+)') print(p1.findall(s))
結果為:
[('A','B'),('C','D')]
僅供學習! 2019.10.8