. | 匹配任意除換行符「\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] |
\ | 表明表達式任意匹配一個 |
---|---|
(..) | 被括起來的表達式將做爲分組 |
[^..…] | 匹配除了這組字符之外的字符 |
正則表達式一般用於在文本中查找匹配的字符串。Python裏數量詞默認是貪婪的(在少數語言裏也多是默認非貪婪),老是嘗試匹配儘量多的字符;非貪婪的則相反,老是嘗試匹配儘量少的字符。例如:正則表達式」ab」若是用於查找」abbbc」,將找到」abbb」。而若是使用非貪婪的數量詞」ab?」,將找到」a」。html
注:咱們通常使用非貪婪模式來提取。python
與大多數編程語言相同,正則表達式裏使用」」做爲轉義字符,這就可能形成反斜槓困擾。假如你須要匹配文本中的字符」」,那麼使用編程語言表示的正則表達式裏將須要4個反斜槓」\\」:前兩個和後兩個分別用於在編程語言裏轉義成反斜槓,轉換成兩個反斜槓後再在正則表達式裏轉義成一個反斜槓。正則表達式
Python裏的原生字符串很好地解決了這個問題,這個例子中的正則表達式可使用r」\」表示。一樣,匹配一個數字的」\d」能夠寫成r」\d」。有了原生字符串,媽媽也不用擔憂是否是漏寫了反斜槓,寫出來的表達式也更直觀勒。編程
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)
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
:節省使用正則表達式解決問題的空間,也就是內存字符串
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>
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']