python正则表达式findall的使用
文章來源與:http://www.cnblogs.com/zjltt/p/6955965.html
正則表達(dá)式
正則表達(dá)式本身是一種小型的、高度專業(yè)化的編程語言,而在python中,通過內(nèi)嵌集成re模塊,程序員們可以直接調(diào)用來實(shí)現(xiàn)正則匹配。正則表達(dá)式模式被編譯成一系列的字節(jié)碼,然后由用C編寫的匹配引擎執(zhí)行。
正則表達(dá)式是用來匹配處理字符串的python 中使用正則表達(dá)式需要引入re模塊
如:
import re #第一步,要引入re模塊
a = re.findall("匹配規(guī)則", "要匹配的字符串") #第二步,調(diào)用模塊函數(shù)
以列表形式返回匹配到的字符串
如:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("匹配規(guī)則", "這個(gè)字符串是否有匹配規(guī)則的字符") #第二步,調(diào)用模塊函數(shù)
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹配規(guī)則']
View Code
^元字符
字符串開始位置與匹配規(guī)則符合就匹配,否則不匹配
匹配字符串開頭。在多行模式中匹配每一行的開頭
^元字符如果寫到[]字符集里就是反取
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("^匹配規(guī)則", "匹配規(guī)則這個(gè)字符串是否匹配") #字符串開始位置與匹配規(guī)則符合就匹配,否則不匹配
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹配規(guī)則']
View Code
[^a-z]反取,匹配出除字母外的字符,^元字符如果寫到字符集里就是反取
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("[^a-z]", "匹配s規(guī)則這s個(gè)字符串是否s匹配f規(guī)則則re則則則") #反取,匹配出除字母外的字符
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹', '配', '規(guī)', '則', '這', '個(gè)', '字', '符', '串', '是', '否', '匹', '配', '規(guī)', '則', '則', '則', '則', '則']
View Code
$元字符
字符串結(jié)束位置與匹配規(guī)則符合就匹配,否則不匹配
匹配字符串末尾,在多行模式中匹配每一行的末尾
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("匹配規(guī)則$", "這個(gè)字符串是否匹配規(guī)則") #字符串結(jié)束位置與匹配規(guī)則符合就匹配,否則不匹配
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹配規(guī)則']
View Code
*元字符
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的*元字符)前面的一個(gè)字符可以是0個(gè)或多個(gè)原本字符
匹配前一個(gè)字符0或多次,貪婪匹配前導(dǎo)字符有多少個(gè)就匹配多少個(gè)很貪婪
如果規(guī)則里只有一個(gè)分組,盡量避免用*否則會(huì)有可能匹配出空字符串
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("匹配規(guī)則*", "這個(gè)字符串是否匹配規(guī)則則則則則") #需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的*元字符)前面的一個(gè)字符可以是0或多個(gè)原本字符
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹配規(guī)則則則則則']
View Code
+元字符
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的+元字符)前面的一個(gè)字符可以是1個(gè)或多個(gè)原本字符
匹配前一個(gè)字符1次或無限次,貪婪匹配前導(dǎo)字符有多少個(gè)就匹配多少個(gè)很貪婪
#!/usr/bin/env python
# -*- coding:gbk -*-
import re #第一步,要引入re模塊
a = re.findall("匹配+", "匹配配配配配規(guī)則這個(gè)字符串是否匹配規(guī)則則則則則") #需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的+元字符)前面的一個(gè)字符可以是1個(gè)或多個(gè)原本字符
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹配配配配配', '匹配']
View Code
?元字符,和防止貪婪匹配
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的?元字符)前面的一個(gè)字符可以是0個(gè)或1個(gè)原本字符
匹配一個(gè)字符0次或1次
還有一個(gè)功能是可以防止貪婪匹配,詳情見防貪婪匹配
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("匹配規(guī)則?", "匹配規(guī)這個(gè)字符串是否匹配規(guī)則則則則則") #需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的?元字符)前面的一個(gè)字符可以是0個(gè)或1個(gè)原本字符
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹配規(guī)', '匹配規(guī)則']
View Code
{}元字符,范圍
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的{} 元字符)前面的一個(gè)字符,是自定義字符數(shù),位數(shù)的原本字符
{m}匹配前一個(gè)字符m次,{m,n}匹配前一個(gè)字符m至n次,若省略n,則匹配m至無限次
{0,}匹配前一個(gè)字符0或多次,等同于*元字符
{+,}匹配前一個(gè)字符1次或無限次,等同于+元字符
{0,1}匹配前一個(gè)字符0次或1次,等同于?元字符
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("匹配規(guī)則{3}", "匹配規(guī)這個(gè)字符串是否匹配規(guī)則則則則則") #{m}匹配前一個(gè)字符m次,{m,n}匹配前一個(gè)字符m至n次,若省略n,則匹配m至無限次
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹配規(guī)則則則']
View Code
[]元字符,字符集
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的[] 元字符)對(duì)應(yīng)位置是[]里的任意一個(gè)字符就匹配
字符集。對(duì)應(yīng)的位置可以是字符集中任意字符。字符集中的字符可以逐個(gè)列出,也可以給出范圍,如[abc]或[a-c]。[^abc]表示取反,即非abc。
所有特殊字符在字符集中都失去其原有的特殊含義。用反斜杠轉(zhuǎn)義恢復(fù)特殊字符的特殊含義。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("匹配[a,b,c]規(guī)則", "匹配a規(guī)則這個(gè)字符串是否匹配b規(guī)則則則則則") #需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的 [] 元字符)對(duì)應(yīng)位置是[]里的任意一個(gè)字符就匹配
print(a) #以列表形式返回匹配到的字符串
View Code
[^]非,反取,匹配出除[^]里面的字符,^元字符如果寫到字符集里就是反取
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("[^a-z]", "匹配s規(guī)則這s個(gè)字符串是否s匹配f規(guī)則則re則則則") #反取,匹配出除字母外的字符
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹', '配', '規(guī)', '則', '這', '個(gè)', '字', '符', '串', '是', '否', '匹', '配', '規(guī)', '則', '則', '則', '則', '則']
View Code
反斜杠后邊跟普通字符實(shí)現(xiàn)特殊功能;(即預(yù)定義字符)
預(yù)定義字符是在字符集和組里都是有用的
d匹配任何十進(jìn)制數(shù),它相當(dāng)于類[0-9]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("d", "匹配規(guī)則這2個(gè)字符串3是否匹配規(guī)則5則則則7則") #d匹配任何十進(jìn)制數(shù),它相當(dāng)于類[0-9]
print(a) #以列表形式返回匹配到的字符串
#打印出 ['2', '3', '5', '7']
View Code
d+如果需要匹配一位或者多位數(shù)的數(shù)字時(shí)用
#!/usr/bin/env python
# -*- coding:gbk -*-
import re #第一步,要引入re模塊
a = re.findall("d+", "匹配規(guī)則這2個(gè)字符串134444是否匹配規(guī)則5則則則7則") #d+如果需要匹配一位或者多位數(shù)的數(shù)字時(shí)用
print(a) #以列表形式返回匹配到的字符串
#打印出 ['2', '134444', '5', '7']
View Code
D匹配任何非數(shù)字字符,它相當(dāng)于類[^0-9]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("D", "匹配規(guī)則這2個(gè)字符串3是否匹配規(guī)則5則則則7則") #D匹配任何非數(shù)字字符,它相當(dāng)于類[^0-9]
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹', '配', '規(guī)', '則', '這', '個(gè)', '字', '符', '串', '是', '否', '匹', '配', '規(guī)', '則', '則', '則', '則', '則']
View Code
s匹配任何空白字符,它相當(dāng)于類[
fv]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("s", "匹配規(guī)則 這2個(gè)字符串3是否匹
配規(guī)則5則則則7則") #s匹配任何空白字符,它相當(dāng)于類[
fv]
print(a) #以列表形式返回匹配到的字符串
#打印出[' ', ' ', ' ', '
']
View Code
S匹配任何非空白字符,它相當(dāng)于類[^
fv]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("S", "匹配規(guī)則 這2個(gè)字符串3是否匹
配規(guī)則5則則則7則") #S匹配任何非空白字符,它相當(dāng)于類[^
fv]
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹', '配', '規(guī)', '則', '這', '2', '個(gè)', '字', '符', '串', '3', '是', '否', '匹', '配', '規(guī)', '則', '5', '則', '則', '則', '7', '則']
View Code
w匹配包括下劃線在內(nèi)任何字母數(shù)字字符,它相當(dāng)于類[a-zA-Z0-9_]
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re #第一步,要引入re模塊
a = re.findall('w',"https://www.cnblogs.com/") #w匹配包括下劃線在內(nèi)任何字母數(shù)字字符,它相當(dāng)于類[a-zA-Z0-9_]
print(a) #以列表形式返回匹配到的字符串
#打印出 ['h', 't', 't', 'p', 's', 'w', 'w', 'w', 'c', 'n', 'b', 'l', 'o', 'g', 's', 'c', 'o', 'm']
View Code
W匹配非任何字母數(shù)字字符包括下劃線在內(nèi),它相當(dāng)于類[^a-zA-Z0-9_]
import re #第一步,要引入re模塊
a = re.findall('W',"https://www.cnblogs.com/") #w匹配包括下劃線在內(nèi)任何字母數(shù)字字符,它相當(dāng)于類[a-zA-Z0-9_]
print(a) #以列表形式返回匹配到的字符串
#打印出[':', '/', '/', '.', '.', '/']
View Code
()元字符,分組
也就是分組匹配,()里面的為一個(gè)組也可以理解成一個(gè)整體
如果()后面跟的是特殊元字符如 (adc)* 那么*控制的前導(dǎo)字符就是()里的整體內(nèi)容,不再是前導(dǎo)一個(gè)字符
列1
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re #第一步,要引入re模塊
#也就是分組匹配,()里面的為一個(gè)組也可以理解成一個(gè)整體
a = re.search("(a4)+", "a4a4a4a4a4dg4g654gb") #匹配一個(gè)或多個(gè)a4
b = a.group()
print(b)
#打印出 a4a4a4a4a4
View Code
列2
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re #第一步,要引入re模塊
#也就是分組匹配,()里面的為一個(gè)組也可以理解成一個(gè)整體
a = re.search("a(d+)", "a466666664a4a4a4dg4g654gb") #匹配 (a) (d0-9的數(shù)字) (+可以是1個(gè)到多個(gè)0-9的數(shù)字)
b = a.group()
print(b)
#打印出 a466666664
View Code
|元字符,或
|或,或就是前后其中一個(gè)符合就匹配
#!/usr/bin/env python # -*- coding:utf8 -*- import re #第一步,要引入re模塊 a = re.findall(r"你|好", "a4a4a你4aabc4a4dgg好dg4g654g") #|或,或就是前后其中一個(gè)符合就匹配 print(a) #打印出 ['你', '好']
View Code
r原生字符
將在python里有特殊意義的字符如,轉(zhuǎn)換成原生字符(就是去除它在python的特殊意義),不然會(huì)給正則表達(dá)式有沖突,為了避免這種沖突可以在規(guī)則前加原始字符r
re模塊中常用功能函數(shù)
正則表達(dá)式有兩種書寫方式,一種是直接在函數(shù)里書寫規(guī)則,
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re #第一步,要引入re模塊
a = re.findall("匹配規(guī)則", "這個(gè)字符串是否有匹配規(guī)則的字符") #第二步,調(diào)用模塊函數(shù)
print(a) #以列表形式返回匹配到的字符串
#打印出 ['匹配規(guī)則']
View Code
match()函數(shù)(以后常用)
match,從頭匹配一個(gè)符合規(guī)則的字符串,從起始位置開始匹配,匹配成功返回一個(gè)對(duì)象,未匹配成功返回None
match(pattern, string, flags=0)
# pattern: 正則模型
# string : 要匹配的字符串
# falgs : 匹配模式
注意:match()函數(shù) 與search()函數(shù)基本是一樣的功能,不一樣的就是match()匹配字符串開始位置的一個(gè)符合規(guī)則的字符串,search()是在字符串全局匹配第一個(gè)合規(guī)則的字符串
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
#無分組
origin = "hello egon bcd egon lge egon acd 19"
r = re.match("hw+", origin) #match,從起始位置開始匹配,匹配成功返回一個(gè)對(duì)象,未匹配成功返回None
print(r.group()) # 獲取匹配到的所有結(jié)果,不管有沒有分組將匹配到的全部拿出來
print(r.groups()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分的結(jié)果
print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分定義了key的組結(jié)果
#輸出結(jié)果
# hello 匹配到的全部拿出來
# () 沒有分組所以為空
# {} 沒分組部分定義了key的組所以為空
# 有分組
# 為何要有分組?提取匹配成功的指定內(nèi)容(先匹配成功全部正則,再匹配成功的局部?jī)?nèi)容提取出來)
r = re.match("h(w+)", origin) #match,從起始位置開始匹配,匹配成功返回一個(gè)對(duì)象,未匹配成功返回None
print(r.group()) # 獲取匹配到的所有結(jié)果,不管有沒有分組將匹配到的全部拿出來
print(r.groups()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分的結(jié)果
print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分定義了key的組結(jié)果
#輸出結(jié)果
# hello 匹配到的全部拿出來
# ('ello',) 有分組,在匹配到的字符串中拿出分組的部分
# {} 沒分組部分定義了key的組所以為空
# 有兩個(gè)分組定義了key
# 為何要有分組?提取匹配成功的指定內(nèi)容(先匹配成功全部正則,再匹配成功的局部?jī)?nèi)容提取出來)
r = re.match("(?P<n1>h)(?P<n2>w+)", origin) #?P<>定義組里匹配內(nèi)容的key(鍵),<>里面寫key名稱,值就是匹配到的內(nèi)容
print(r.group()) # 獲取匹配到的所有結(jié)果,不管有沒有分組將匹配到的全部拿出來
print(r.groups()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分的結(jié)果
print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分定義了key的組結(jié)果
#輸出結(jié)果
# hello 匹配到的全部拿出來
# ('h', 'ello') 有分組,在匹配到的字符串中拿出分組的部分
# {'n1': 'h', 'n2': 'ello'} 有定義了key的組所以,將定義了key的組里的內(nèi)容以字典形式拿出來
View Code
?P<n1> #?P<>定義組里匹配內(nèi)容的key(鍵),<>里面寫key名稱,值就是匹配到的內(nèi)容(只對(duì)正則函數(shù)返回對(duì)象的有用)
取出匹配對(duì)象方法
只對(duì)正則函數(shù)返回對(duì)象的有用
group() # 獲取匹配到的所有結(jié)果,不管有沒有分組將匹配到的全部拿出來,有參取匹配到的第幾個(gè)如2
groups() # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分的結(jié)果
groupdict() # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分定義了key的組結(jié)果
search()函數(shù)
search,瀏覽全部字符串,匹配第一符合規(guī)則的字符串,瀏覽整個(gè)字符串去匹配第一個(gè),未匹配成功返回None
search(pattern, string, flags=0)
# pattern: 正則模型
# string : 要匹配的字符串
# falgs : 匹配模式
注意:match()函數(shù) 與search()函數(shù)基本是一樣的功能,不一樣的就是match()匹配字符串開始位置的一個(gè)符合規(guī)則的字符串,search()是在字符串全局匹配第一個(gè)合規(guī)則的字符串
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
#無分組
origin = "hello alex bcd alex lge alex acd 19"
r = re.search("aw+", origin) #search瀏覽全部字符串,匹配第一符合規(guī)則的字符串,瀏覽整個(gè)字符串去匹配第一個(gè),未匹配成功返回None
print(r.group()) # 獲取匹配到的所有結(jié)果,不管有沒有分組將匹配到的全部拿出來
print(r.groups()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分的結(jié)果
print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分定義了key的組結(jié)果
#輸出結(jié)果
# alex 匹配到的全部拿出來
# () 沒有分組所以為空
# {} 沒分組部分定義了key的組所以為空
# 有分組
# 為何要有分組?提取匹配成功的指定內(nèi)容(先匹配成功全部正則,再匹配成功的局部?jī)?nèi)容提取出來)
r = re.search("a(w+).*(d)", origin)
print(r.group()) # 獲取匹配到的所有結(jié)果,不管有沒有分組將匹配到的全部拿出來
print(r.groups()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分的結(jié)果
print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分定義了key的組結(jié)果
#輸出結(jié)果
# alex bcd alex lge alex acd 19 匹配到的全部拿出來
# ('lex', '9') 有分組,在匹配到的字符串中拿出分組的部分
# {} 沒分組部分定義了key的組所以為空
# 有兩個(gè)分組定義了key
# 為何要有分組?提取匹配成功的指定內(nèi)容(先匹配成功全部正則,再匹配成功的局部?jī)?nèi)容提取出來)
r = re.search("a(?P<n1>w+).*(?P<n2>d)", origin) #?P<>定義組里匹配內(nèi)容的key(鍵),<>里面寫key名稱,值就是匹配到的內(nèi)容
print(r.group()) # 獲取匹配到的所有結(jié)果,不管有沒有分組將匹配到的全部拿出來
print(r.groups()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分的結(jié)果
print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分定義了key的組結(jié)果
#輸出結(jié)果
# alex bcd alex lge alex acd 19 匹配到的全部拿出來
# ('lex', '9') 有分組,在匹配到的字符串中拿出分組的部分
# {'n1': 'lex', 'n2': '9'} 有定義了key的組所以,將定義了key的組里的內(nèi)容以字典形式拿出來
View Code
findall()函數(shù)(以后常用)
findall(pattern, string, flags=0)
# pattern: 正則模型
# string : 要匹配的字符串
# falgs : 匹配模式
瀏覽全部字符串,匹配所有合規(guī)則的字符串,匹配到的字符串放到一個(gè)列表中,未匹配成功返回空列表
注意:一旦匹配成,再次匹配,是從前一次匹配成功的,后面一位開始的,也可以理解為匹配成功的字符串,不在參與下次匹配
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
#無分組
r = re.findall("d+wd+", "a2b3c4d5") #瀏覽全部字符串,匹配所有合規(guī)則的字符串,匹配到的字符串放到一個(gè)列表中
print(r)
#輸出結(jié)果
#['2b3', '4d5']
#注意:匹配成功的字符串,不在參與下次匹配,所以3c4也符合規(guī)則但是沒匹配到
View Code
注意:如果沒寫匹配規(guī)則,也就是空規(guī)則,返回的是一個(gè)比原始字符串多一位的,空字符串列表
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
#無分組
r = re.findall("", "a2b3c4d5") #瀏覽全部字符串,匹配所有合規(guī)則的字符串,匹配到的字符串放到一個(gè)列表中
print(r)
#輸出結(jié)果
#['', '', '', '', '', '', '', '', '']
#注意:如果沒寫匹配規(guī)則,也就是空規(guī)則,返回的是一個(gè)比原始字符串多一位的,空字符串列表
View Code
注意:正則匹配到空字符的情況,如果規(guī)則里只有一個(gè)組,而組后面是*就表示組里的內(nèi)容可以是0個(gè)或者多過,這樣組里就有了兩個(gè)意思,一個(gè)意思是匹配組里的內(nèi)容,二個(gè)意思是匹配組里0內(nèi)容(即是空白)所以盡量避免用*否則會(huì)有可能匹配出空字符串
注意:正則只拿組里最后一位,如果規(guī)則里只有一個(gè)組,匹配到的字符串里在拿組內(nèi)容是,拿的是匹配到的內(nèi)容最后一位
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.findall("(a)*", origin)
print(r)
#輸出結(jié)果 ['', '', '', '', '', '', 'a', '', '', '', '', '', '', '', '', 'a', '', '', '', '', '', '', '', '', 'a', '', '', '', '', 'a', '', '', '', '', '', '']
View Code
無分組:匹配所有合規(guī)則的字符串,匹配到的字符串放到一個(gè)列表中
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
#無分組
origin = "hello alex bcd alex lge alex acd 19"
r = re.findall("aw+", origin) #瀏覽全部字符串,匹配所有合規(guī)則的字符串,匹配到的字符串放到一個(gè)列表中
print(r)
#輸出結(jié)果
#['alex', 'alex', 'alex', 'acd']
#匹配所有合規(guī)則的字符串,匹配到的字符串放到一個(gè)列表中
View Code
有分組:只將匹配到的字符串里,組的部分放到列表里返回,相當(dāng)于groups()方法
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.findall("a(w+)", origin) #有分組:只將匹配到的字符串里,組的部分放到列表里返回
print(r)
#輸出結(jié)果
#['lex', 'lex', 'lex', 'cd']
View Code
多個(gè)分組:只將匹配到的字符串里,組的部分放到一個(gè)元組中,最后將所有元組放到一個(gè)列表里返
相當(dāng)于在group()結(jié)果里再將組的部分,分別,拿出來放入一個(gè)元組,最后將所有元組放入一個(gè)列表返回
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.findall("(a)(w+)", origin) #多個(gè)分組:只將匹配到的字符串里,組的部分放到一個(gè)元組中,最后將所有元組放到一個(gè)列表里返回
print(r)
#輸出結(jié)果
#[('a', 'lex'), ('a', 'lex'), ('a', 'lex'), ('a', 'cd')]
View Code
分組中有分組:只將匹配到的字符串里,組的部分放到一個(gè)元組中,先將包含有組的組,看作一個(gè)整體也就是一個(gè)組,把這個(gè)整體組放入一個(gè)元組里,然后在把組里的組放入一個(gè)元組,最后將所有組放入一個(gè)列表返回
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.findall("(a)(w+(e))", origin) #分組中有分組:只將匹配到的字符串里,組的部分放到一個(gè)元組中,先將包含有組的組,看作一個(gè)整體也就是一個(gè)組,把這個(gè)整體組放入一個(gè)元組里,然后在把組里的組放入一個(gè)元組,最后將所有組放入一個(gè)列表返回
print(r)
#輸出結(jié)果
#[('a', 'le', 'e'), ('a', 'le', 'e'), ('a', 'le', 'e')]
View Code
?:在有分組的情況下findall()函數(shù),不只拿分組里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正則對(duì)象的函數(shù)如findall()
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
origin = "hello alex bcd alex lge alex acd 19"
b = re.findall("a(?:w+)",origin) #?:在有分組的情況下,不只拿分組里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正則對(duì)象的函數(shù)如findall()
print(b)
#輸出
# ['alex', 'alex', 'alex', 'acd']
View Code
split()函數(shù)
根據(jù)正則匹配分割字符串,返回分割后的一個(gè)列表
split(pattern, string, maxsplit=0, flags=0)
# pattern: 正則模型
# string : 要匹配的字符串
# maxsplit:指定分割個(gè)數(shù)
# flags : 匹配模式
按照一個(gè)字符將全部字符串進(jìn)行分割
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.split("a", origin) #根據(jù)正則匹配分割字符串
print(r)
#輸出結(jié)果 ['hello ', 'lex bcd ', 'lex lge ', 'lex ', 'cd 19']
#根據(jù)a進(jìn)行分組
View Code
將匹配到的字符串作為分割標(biāo)準(zhǔn)進(jìn)行分割
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
origin = "hello alex bcd alex lge alex 2acd 19"
r = re.split("aw+", origin) #根據(jù)正則匹配分割字符串
print(r)
#輸出結(jié)果 ['hello ', ' bcd ', ' lge ', ' 2', ' 19']
#將匹配到的字符串作為分割標(biāo)準(zhǔn)進(jìn)行分割
View Code
sub()函數(shù)
替換匹配成功的指定位置字符串
sub(pattern, repl, string, count=0, flags=0)
# pattern: 正則模型
# repl : 要替換的字符串
# string : 要匹配的字符串
# count : 指定匹配個(gè)數(shù)
# flags : 匹配模式
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.sub("a","替換",origin) #替換匹配成功的指定位置字符串
print(r)
#輸出
# hello 替換lex bcd 替換lex lge 替換lex 替換cd 19
View Code
subn()函數(shù)
替換匹配成功的指定位置字符串,并且返回替換次數(shù),可以用兩個(gè)變量分別接受
subn(pattern, repl, string, count=0, flags=0)
# pattern: 正則模型
# repl : 要替換的字符串
# string : 要匹配的字符串
# count : 指定匹配個(gè)數(shù)
# flags : 匹配模式
#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
origin = "hello alex bcd alex lge alex acd 19"
a,b = re.subn("a","替換",origin) #替換匹配成功的指定位置字符串,并且返回替換次數(shù),可以用兩個(gè)變量分別接受
print(a)
print(b)
#輸出
# hello 替換lex bcd 替換lex lge 替換lex 替換cd 19
# 4
View Code
元字符表
|
. |
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的.元字符)可以是任何一個(gè)字符,匹配任意除換行符" |
a.c |
abc |
|
|
1.反斜杠后邊跟元字符去除特殊功能;(即將特殊字符轉(zhuǎn)義成普通字符),2.反斜杠后邊跟普通字符實(shí)現(xiàn)特殊功能;(即預(yù)定義字符),3.2引用序號(hào)對(duì)應(yīng)的字組 |
a.c;a\c |
a.c;ac |
|
* |
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的*元字符)前面的一個(gè)字符可以是0個(gè)或多個(gè)原本字符,匹配前一個(gè)字符0或多次,貪婪匹配前導(dǎo)字符有多少個(gè)就匹配多少個(gè)很貪婪,如果規(guī)則里只有一個(gè)分組,盡量避免用*否則會(huì)有可能匹配出空字符串 |
abc* |
ab;abccc |
|
+ |
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的+元字符)前面的一個(gè)字符可以是1個(gè)或多個(gè)原本字符,匹配前一個(gè)字符1次或無限次,貪婪匹配前導(dǎo)字符有多少個(gè)就匹配多少個(gè)很貪婪 |
abc+ |
abc;abccc |
|
? |
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的?元字符)前面的一個(gè)字符可以是0個(gè)或1個(gè)原本字符,匹配一個(gè)字符0次或1次,還有一個(gè)功能是可以防止貪婪匹配,詳情見防貪婪匹配 |
abc? |
ab;abc |
|
^ |
字符串開始位置與匹配規(guī)則符合就匹配,否則不匹配,匹配字符串開頭。在多行模式中匹配每一行的開頭,^元字符如果寫到[]字符集里就是反取 |
^abc |
abc |
|
$ |
字符串結(jié)束位置與匹配規(guī)則符合就匹配,否則不匹配,匹配字符串末尾,在多行模式中匹配每一行的末尾 |
abc$ |
abc |
|
| |
|或,或就是前后其中一個(gè)符合就匹配 |
abc|def |
abc def |
|
{} |
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的{}元字符)前面的一個(gè)字符,是自定義字符數(shù),位數(shù)的原本字符,{m}匹配前一個(gè)字符m次,{m,n}匹配前一個(gè)字符m至n次,若省略n,則匹配m至無限次,{0,}匹配前一個(gè)字符0或多次,等同于*元字符,{+,}匹配前一個(gè)字符1次或無限次,等同于+元字符,{0,1}匹配前一個(gè)字符0次或1次,等同于?元字符 |
ab{1,2}c |
abc abbc |
|
[] |
需要字符串里完全符合,匹配規(guī)則,就匹配,(規(guī)則里的[]元字符)對(duì)應(yīng)位置是[]里的任意一個(gè)字符就匹配,字符集。對(duì)應(yīng)的位置可以是字符集中任意字符。字符集中的字符可以逐個(gè)列出,也可以給出范圍,如[abc]或[a-c]。[^abc]表示取反,即非abc。所有特殊字符在字符集中都失去其原有的特殊含義。用反斜杠轉(zhuǎn)義恢復(fù)特殊字符的特殊含義。 |
a[bcd]e |
abe ace ade |
|
() |
也就是分組匹配,()里面的為一個(gè)組也可以理解成一個(gè)整體,如果()后面跟的是特殊元字符如 (adc)* 那么*控制的前導(dǎo)字符就是()里的整體內(nèi)容,不再是前導(dǎo)一個(gè)字符 |
(abc){2} |
abcabc a456c |
預(yù)定義字符集表,可以寫在字符集[...]中
|
d |
d匹配任何十進(jìn)制數(shù),它相當(dāng)于類[0-9],d+如果需要匹配一位或者多位數(shù)的數(shù)字時(shí)用 |
ac |
a1c |
|
D |
D匹配任何非數(shù)字字符,它相當(dāng)于類[^0-9] |
aDc |
abc |
|
s |
s匹配任何空白字符,它相當(dāng)于類[ |
asc |
a c |
|
S |
S匹配任何非空白字符,它相當(dāng)于類[^ |
aSc |
abc |
|
w |
w匹配包括下劃線在內(nèi)任何字母數(shù)字字符,它相當(dāng)于類[a-zA-Z0-9_] |
awc |
abc |
|
W |
W匹配非任何字母數(shù)字字符包括下劃線在內(nèi),它相當(dāng)于類[^a-zA-Z0-9_] |
aWc |
a c |
|
A |
僅匹配字符串開頭,同^ |
Aabc |
abc |
|
|
僅匹配字符串結(jié)尾,同$ |
abc |
abc |
|
|
b匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置 |
abc |
空格abc空格 |
|
B |
[^] |
aBbc |
abc |
特殊分組用法表:只對(duì)正則函數(shù)返回對(duì)象的有用
|
(?P<name>) |
?P<>定義組里匹配內(nèi)容的key(鍵),<>里面寫key名稱,值就是匹配到的內(nèi)容,在用groupdict()方法打印字符串 |
(?P<id>abc){2} |
abcabc |
|
(?P=name) |
引用別名為<name>的分組匹配到字符串 |
(?P<id>d)abc(?P=id) |
1abc1 5abc5 |
|
<number> |
引用編號(hào)為<number>的分組匹配到字符串 |
(d)abc1 |
1abc1 5abc5 |
正則匹配模式表
|
標(biāo)志 |
含義 |
|
re.S(DOTALL) |
使.匹配包括換行在內(nèi)的所有字符 |
|
re.I(IGNORECASE) |
使匹配對(duì)大小寫不敏感 |
|
re.L(LOCALE) |
做本地化識(shí)別(locale-aware)匹配,法語等 |
|
re.M(MULTILINE) |
多行匹配,影響^和$ |
|
re.X(VERBOSE) |
該標(biāo)志通過給予更靈活的格式以便將正則表達(dá)式寫得更易于理解 |
|
re.U |
根據(jù)Unicode字符集解析字符,這個(gè)標(biāo)志影響w,W,,B |
正則表達(dá)式重點(diǎn)
一、
r原生字符
將在python里有特殊意義的字符如,轉(zhuǎn)換成原生字符(就是去除它在python的特殊意義),不然會(huì)給正則表達(dá)式有沖突,為了避免這種沖突可以在規(guī)則前加原始字符r
二、
正則表達(dá)式,返回類型為表達(dá)式對(duì)象的
如:<_sre.SRE_Match object; span=(6, 7), match='a'>
返回對(duì)象的,需要用正則方法取字符串,
方法有
group() # 獲取匹配到的所有結(jié)果,不管有沒有分組將匹配到的全部拿出來,有參取匹配到的第幾個(gè)如2
groups() # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分的結(jié)果
groupdict() # 獲取模型中匹配到的分組結(jié)果,只拿出匹配到的字符串中分組部分定義了key的組結(jié)果
三、
匹配到的字符串里出現(xiàn)空字符
注意:正則匹配到空字符的情況,如果規(guī)則里只有一個(gè)組,而組后面是*就表示組里的內(nèi)容可以是0個(gè)或者多過,這樣組里就有了兩個(gè)意思,一個(gè)意思是匹配組里的內(nèi)容,二個(gè)意思是匹配組里0內(nèi)容(即是空白)所以盡量避免用*否則會(huì)有可能匹配出空字符串
四、
()分組
注意:分組的意義,就是在匹配成功的字符串中,在提取()里,組里面的字符串
五、
?:在有分組的情況下findall()函數(shù),不只拿分組里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正則對(duì)象的函數(shù)如findall()
總結(jié)
以上是生活随笔為你收集整理的python正则表达式findall的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 房贷选择银行有区别吗
- 下一篇: 我行我素是什么意思(我行我素是什么样的人