python正則表達式
目錄:
1.用正則表達式查找特定信息
2.用正則表達式分割、替換字符串
1.用正則表達式查找特定信息
1.1最基本match search findall(常用)
match:
match匹配以"xxx"開頭的字符串,若不是開頭的,盡管屬於str內,則無法匹配
如果匹配則返回匹配的對象以及條件
代碼如下:
import re str="""dd 發達的bcfdsfd4235 ddm mM 43 3 dggfhg dm 割符號分割 各個 24 432 """
print(re.match("dd",str)) #match匹配以"xxx"開頭的字符串,若不是開頭的,盡管屬於str內,則無法匹配,如果匹配則返回匹配的對象以及條件
print(re.match("dd",str).span()) #span得到匹配字符的位置
search:
import re str="""dd 發達的bcfdsfd4235 ddm mM 43 3 dggfhg dm 割符號分割 各個 24 432 """
print(re.search("43",str)) #只匹配一次 #<_sre.SRE_Match object; span=(29, 31), match='43'>
print(re.search("43",str).span()) #(29, 31) print(re.search("43",str).group()) #group得到匹配字符的值 '43'
findall:
語法:findall(pattern, string, flags
=
0
)
返回string中所有與pattern相匹配的全部字串,返回形式為數組
import re str="""dd 發達的bcfdsfd4235 ddm mM 43 3 dggfhg dm 割符號分割 各個 24 432 """
print(re.findall("dd",str)) #findall得到所有匹配條件的字符(列表形式)
print(re.findall("[a-d1-4]",str)) #[],只要匹配[]其中一個即可
print(re.findall("(dd|43)",str)) #(),可以匹配多個字符 #任意漢字[\u4e00-\u9fa5]+
print(re.findall(r"[\u4e00-\u9fa5]+",str)) print(re.findall(r"\d",str)) #\d匹配任意數字
print(re.findall(r"\d{1,2}",str)) #匹配1~2個數字
print(re.findall(r"\w",str)) #\w 數字、字母、漢字、下划線
print(re.findall(r"\s",str)) #匹配任何空白字符:[<空格>\t\r\n\f\v]
print(re.findall(".",str)) #.匹配任意字符
print(re.findall(r"\d$",str)) #$匹配字符串末尾(以數字結尾),在多行模式中匹配每一行的末尾
print(re.findall(r"^\d",str)) #^匹配以數字開頭
print(re.findall(r"\d+",str)) #+匹配一個字符1次或無限次
print(re.findall(r"\d*",str)) #*匹配一個字符0或多次
print(re.findall(r"\d?",str)) #?匹配一個字符0次或1次
print(re.findall(r"\d.+",str)) #默認為貪婪模式
print(re.findall(r"\d.+?",str)) #?把模式改為非貪婪模式
標志位:
import re str="""dd 發達的bcfdsfd4235 ddm mM 43 3 dggfhg dm 割符號分割 各個 24 432 """
print(re.findall("m",str,re.I)) #re.I忽略大小寫
print(re.findall(r"\d.",str,re.S)) #re.S匹配包括換行在內的所有字符
print(re.findall(r"\d$",str,re.M)) #re.M多行匹配
print(re.findall(r"^\d",str,re.M)) #^匹配字符串開頭
分組:
#分組
import re str="""dd 發達的bcfdsfd4235 ddm mM 43 3 dggfhg dm 割符號分割 各個 24 432 """
print(re.findall(r"\d(.)(\d)",str,re.S)) #以分組呈現,只顯示帶括號的內容
print(re.search(r"\d(.)(\d)",str,re.S)) print(re.search(r"\d(.)(\d)",str,re.S).group(0)) #原始字符串 "423"
print(re.search(r"\d(.)(\d)",str,re.S).group(1)) #第一個子串 "2"
print(re.search(r"\d(.)(\d)",str,re.S).group(2)) #第二個子串 "3"
print(re.search(r"\d(.)(\d)",str,re.S).groups()) #所有的子串 ('2','3')
2.用正則表達式分割、替換字符串
re.sub(pattern, repl, string, count=0, flags=0)
第一個參數:規則
第二個參數:替換后的字符串
第三個參數:字符串
第四個參數:替換個數。默認為0,表示每個匹配項都替換
import re str=""" ASDSF4234ff gfhgh3454阿桑的歌dd 32435 66 GBJ """
#預編譯
s1=re.compile(r"\d") print(s1.search(str,10).group()) #search(str,10),從第10為開始匹配
print(s1.findall(str,3,12)) #split
print(str.split("4")) print(re.split("\d+",str)) s3=re.compile(r"\d+") print(s3.split(str)) print(s3.split(str,1)) #只分割1次 #sub #第一個參數:規則 #第二個參數:替換后的字符串 #第三個參數:字符串 #第四個參數:替換個數。默認為0,表示每個匹配項都替換
print(re.sub("5","ss",str)) #把5替換成ss
s4=compile(r"\d+") m4=re.compile(r"\d+") print(m4.sub(" ",astr)) #把數字替換成空格
print(m4.sub(" ",astr,2)) #替換兩次 #小寫變大寫
def f3(m): return m.group().upper() print(re.sub(r"[a-z]",f3,astr))