1. 程式人生 > >python正則表示式貪婪演算法與非貪婪演算法與正則表示式子模式的簡單應用

python正則表示式貪婪演算法與非貪婪演算法與正則表示式子模式的簡單應用

先引入一下百度百科對於正則表示式的概念:

正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。

 

然後我們來引入一下貪婪演算法與非貪婪演算法的一個概念:

貪婪演算法:

貪婪匹配(預設的):在整個表示式匹配成功的前提下,儘可能多的匹配
表達方式: .* .+ .? ·······

 

 

非貪婪演算法:

貪婪匹配:在整個表示式匹配成功的前提下,儘可能少的匹配 
表達方式: .* ? .+? .?? ·······

 

 

當然我們通過程式碼也可以看出來

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

 

 

 

 




&n