Python正则re模块
常用方法
编译
re.compile(pattern,flags=0)->regex #将正则表达式模式编译成正则表达式对象。
- pattern #需要编译的正则表达式
- flags #正则表达式使用的模式。re.S|re.M 开启多行模式和单行模式
- 常用模式有:re.I,re.M,re.S,re.X
为了提高效率,正则表达式可以被编译,这些编译后的结果被保存,下次使用同样的pattern的时候,就不需要再次编译。
编译后的对象同样可以使用match(),search()方法进行匹配。
单次匹配
- re.match(pattern,string,flags=0)->match #匹配从字符串的开头匹配,返回match对象
- regex.match(string[,pos[,endpos]])->match #regex对象match方法可以重设定开始位置和结束位置。返回match对象
- pattern #正则表达式
- string #需要匹配的字符串
- flags #正则表达式使用的模式
- 常用模式有:re.I,re.M,re.S,re.X
- pos #匹配字符串的开始位置,默认从0索引位置开始匹配
- endpos #匹配字符串的结束位置(不包含结束位置),默认值为len(string)
- 注意:
- match会从字符串的开头开始查找,即使在re.M(多行模式)中。^符号也只表示字符串的开头,$符号也只表示字符串的结尾。即:多行模式re.M对match无效
- match只会从字符串的开始位置(开始位置可以是字符串的开头,也可以用pos指定)与正则表达式的第一个字符开始匹配。
- regex.match中指定开始位置和结束位置后启用多行模式,对^和$符号无影响,依然是指原字符串的开头和结尾
- re.match,re.search,re.fullmatch三个匹配方法中只有re.match忽略多行模式的影响。
示例:
import re str1 = """123 456""" print(re.match("^\d*",str1,re.M)) print(re.match("^\d*",str1)) print(re.match("^[\d\n]*",str1,re.M)) regex = re.compile("^\d*") print(regex.match(str1)) #注意regex可以重新指定字符串的开始位置,和结束位置(不包含结束位置) print(regex.match(str1,0,2)) #注意:regex中开始位置和结束位置对^和$符号无影响,依然是指原字符串的开头和结尾 print(regex.match(str1,3)) #返回值为None,因为截开始的位置不是字符串的开头。所以无法匹配
search
- re.fullmatch(pattern,string,flags=0)->match #(整个字符串和正则表达式匹配)起始位置和结束位置的字符串和整个正则表达式匹配
- regex.fullmatch(string[,pos[,endpos]])->match #(整个字符串和正则表达式匹配)起始位置和结束位置的字符串和整个正则表达式匹配
- pattern #正则表达式
- string #需要匹配的字符串
- flags #模式
- pos #匹配的起始位置
- endpos #匹配的结束位置(不包含结束位置)
import re str2 = """abc abc bcd eff aaa bc bcd""" print(re.fullmatch("bcd",str2)) #fullmatch起始位置和结束位置的字符串和整个正则表达式匹配 print(re.fullmatch("a[\w \n]*",str2)) print(re.fullmatch("b[\w \n]*",str2,re.M)) print(re.compile("b[\w \n]*").fullmatch(str2,20)) #改变起始位置匹配 print(re.compile("^b[\w \n]*").fullmatch(str2,20)) #因为是单行模式,所有^只表示字符串的开始位置 print(re.compile("^b[\w \n]*",re.M).fullmatch(str2,20)) #可以识别多行模式
全文搜素(findall)
- re.findall(pattern,string,flags=0)->list #对整个字符串从左至右匹配,返回所有匹配项的列表
- regex.findall(string[,pos[,endpos]])->list #对整个字符串从左至右匹配,返回所有匹配项的列表
- pattern #正则表达式
- tring #需要匹配的字符
- flags #模式
- pos #匹配的起始位置
- endpos #匹配的结束位置(不包含结束位置)
import re str1 = """abc abcd def dbc abc""" print(re.findall("\w+",str1)) repex = re.compile("\w+") print(repex.findall(str1)) print(repex.findall(str1,5)) print("-------------") print(re.findall("^\w+",str1)) print(re.findall("^\w+",str1,re.M))
- re.finditer(pattern,string,flags=0)->iterable #对整个字符串从左至右匹配,返回所有匹配选项,返回迭代器
- regex.finditer(string[,pos[,endpos]])->iterable ##对整个字符串从左至右匹配,返回所有匹配选项,返回迭代器
- 注意:每次迭代返回的都是match对象
import re str1 = """abc abcd def dbc abc""" reiter = re.finditer("\w+",str1) print(type(reiter),reiter) a = next(reiter) print(type(i),i) for i in reiter: print(i.start(),i.end(),i.span(),i.group(0)) print(i)
匹配替换
- re.sub(pattern,replacement,string,count=0,flags=0)->new_string #将匹配到的字符替换成指定字符
- regex.sub(replacement,string,count=0)->new_string #将匹配到的字符替换成指定字符
- re.subn(pattern,replacement,string,count=0,flags=0)->(new_string,number_of_subs_made) #将匹配到的字符替换成指定字符
- regex.subn(replacement,string,count=0)->(new_string,number_of_subs_made) #将匹配到的字符替换成指定字符
import re str1 = "a23asldkf234xdd" print(re.sub("\d","你",str1)) print(re.subn("\d","你",str1)) print(re.sub("\d","你",str1,2)) req = re.compile("\d") print(req.sub("爱",str1,3)) print(req.subn("爱",str1))
分割
- re.split(pattern,string,maxsplit=0,flags=0)->list
- regex.split(string,maxsplit=0)->list
import re str1 = "a1dslkd3ksdk245ks5jdf" print(re.split("\d",str1)) print(re.split("\d",str1,2)) print("----------") rep = re.compile("\d") print(rep.split(str1)) print(rep.split(str1,1)) print("---------------") print(re.split("k(s)",str1))
Match.group([group1,…]) #获取指定组的元素,如果指定多个组,返回一个元组
- group1 #组的id或者名称
>>> m = re.match(r"(\d+)\.(?P<name>\d+)","24.356") >>> m.group(1),m.group("name"),m.group(1,"name") ('24', '356', ('24', '356'))