re正則

re

經常使用語法:

字符

. 匹配任意除換行符「\n」外的字符
\ 轉義字符,使用後一個字符改變原來的意思
[..] 字符集

預約義字符集:

\d 數字:[0-9]
\D 非數字:[^\d】
\s 空白字符:[ <空格> \t\r\n\f\v]
\S 非空白字符:[^\s】
\w 單詞字符:[A-Za-z0-9]
\W 非空白字符:[^w

數詞量:

* 匹配前一個字符0詞或無限次
+ 匹配前一個字符1次或者無限次
? 匹配前一個字符0次或1次
{m} 匹配前一個字符m次
{m,n} 匹配前一個字符m至n次

邊界匹配(不消耗待匹配字符串中的字符)

^ 匹配字符串開頭
$ 匹配字符串結尾
\A 僅匹配字符串開頭
\Z 僅匹配字符串結尾
\b 匹配\w和\W之間
\B [^B]

邏輯,分組

\ 表明表達式任意匹配一個
(..) 被括起來的表達式將做爲分組
[^..…] 匹配除了這組字符之外的字符

正則表達式相關注解

(1)數量詞的貪婪模式與非貪婪模式

正則表達式一般用於在文本中查找匹配的字符串。Python裏數量詞默認是貪婪的(在少數語言裏也多是默認非貪婪),老是嘗試匹配儘量多的字符;非貪婪的則相反,老是嘗試匹配儘量少的字符。例如:正則表達式」ab」若是用於查找」abbbc」,將找到」abbb」。而若是使用非貪婪的數量詞」ab?」,將找到」a」。html

注:咱們通常使用非貪婪模式來提取。python

(2)反斜槓問題

轉義,在符號前面加上/

與大多數編程語言相同,正則表達式裏使用」」做爲轉義字符,這就可能形成反斜槓困擾。假如你須要匹配文本中的字符」」,那麼使用編程語言表示的正則表達式裏將須要4個反斜槓」\\」:前兩個和後兩個分別用於在編程語言裏轉義成反斜槓,轉換成兩個反斜槓後再在正則表達式裏轉義成一個反斜槓。正則表達式

Python裏的原生字符串很好地解決了這個問題,這個例子中的正則表達式可使用r」\」表示。一樣,匹配一個數字的」\d」能夠寫成r」\d」。有了原生字符串,媽媽也不用擔憂是否是漏寫了反斜槓,寫出來的表達式也更直觀勒。編程

re模塊

findall:匹配全部內容,造成一個列表,每一項都是列表中的一個元素
s = 'https://ygdy8.com/html/gndy/dyzz/20191022/59284.html">2019年懸疑恐怖《暗戰》BD韓<|'

#`findall`匹配全部內容,造成一個列表,每一項都是列表中的一個元素
res = re.findall('com(.*?)5928',s)
print(res)      
#['/html/gndy/dyzz/20191022/']

search:只匹配符合條件的從左到右的第一個,獲得的不是直接結果,而是一個變量,經過此變量的group方法來得到最後結果,若是沒有匹配到符合條件的,則會返回None,使用group會報錯編程語言

res = re.search('com(.*?)5928',s)
print(res.group())
#com/html/gndy/dyzz/20191022/5928

match:從頭開始匹配,至關於search中的正則表達式加上一個"^"code

res = re.match('[a-z]{3}',s)
print(res.group())
#htt

字符串處理的擴展

split:切割,返回列表****htm

res = re.split('\d+',s)
print(res)
#['https://ygdy', '.com/html/gndy/dyzz/', '/', '.html">', '年懸疑恐怖《暗戰》BD韓<|']

sub:切換(舊,新,對象,替換次數)對象

res = re.sub('\d','*',s)
print(res)
#https://ygdy*.com/html/gndy/dyzz/********/*****.html">****年懸疑恐怖《暗戰》BD韓<|

subn:也是替換,不過會返回一個元組,元組中第一個元素是替換後的結果,第二個參數是替換的次數內存

res = re.subn('\d','*',s)
print(res)
#('https://ygdy*.com/html/gndy/dyzz/********/*****.html">****年懸疑恐怖《暗戰》BD韓<|', 18)

re模塊的進階

compile:節省使用正則表達式解決問題的時間,將正則表達式編譯成字節碼,屢次使用過程當中不會再屢次編譯,直接拿來用

s = 'https://ygdy8.com/html/gndy/dyzz/20191022/59284.html">2019年懸疑恐怖《暗戰》BD韓<|'
ret = re.compile('\d+')     #已經完成編譯了
res = ret.findall(s)        #拿來直接用
print(res)
#['8', '20191022', '59284', '2019']

finditer:節省使用正則表達式解決問題的空間,也就是內存字符串

返回一個迭代器,全部的結果都在這個迭代器中,須要經過循環+group的形式取值 可以節省內存

ret = re.finditer('\d+',s)
for i in ret:
    print(i.group())
#8
#20191022
#59284
#2019

正則表達式的分組在re模塊中的使用

s = '<a>wahahafsdfsfdafsaafs</a>'       #標籤語言HTML網頁
ret = re.search('(<\w+>)(\w+)(</\w+>)',s)
print(ret.group())      #<a>wahahafsdfsfdafsaafs</a>   全部結果
print(ret.group(1))     #<a>   數字參數表明的是取對應分組中的內容 第一個分組中的
print(ret.group(2))     #wahahafsdfsfdafsaafs   第二個分組中內容
print(ret.group(3))     #</a>

正則表達式的分組在熱模塊中,爲了findall也能夠順利取到分組中的內容,有一個特殊的語法,優先顯示分組中的內容

s = '<a>wahahafs</a>'
ret = re.findall('(\w+)',s)
print(ret)      #['a', 'wahahafs', 'a']
res = re.findall('>(\w+)<',s)       #優先尋找匹配括號中的內容
print(res)      #['wahahafs']

若是想取消分組優先

形式:(?:正則表達式)

ret = re.findall('\d+(\.\d+)','1.234*4') 
print(ret) >>> ['.234']

ret = re.findall('\d+(?:\.\d+)','1.234*4') #取消了分組優先
print(ret) >>> ['1.234']
相關文章
相關標籤/搜索