re模块(正则表达式):
*元字符:不是普通的字符,是特殊字符!
1:通配符:. 可以匹配除了换行符以外的任意一个字符
例子:re.findall('l..e',"abcloveabc") #匹配字符串中以l开头以e结尾且长度为4的字符串,若有多个则以列表的形式返回
2:^ :以什么开头,只能从str开头进行匹配
例子:re.findall('^l..e',"loveabc") #注意:只能从str的开头进行匹配,且^前不能加其他元字符
3:$:以什么结尾,只能从str结尾进行匹配
例子:re.findall('p.z$',"abcpzz") #返回结果:["pzz"]
4: *:匹配字符重复0-无穷次的字符串
例子: re.findall('p*','abpcppdp') #返回结果['','','p','','pp','','p']
re.findall('pz*',"abcpzzzz")#返回结果是['pzzzz']
re.findall('pz*',"abcp") #返回结果是:['p']
+:匹配字符重复1-无穷次的字符串 (要求匹配的字符重复次数至少是1)
例子:re.findall('pz+',"abcp") #返回结果是:[]
?:匹配字符重复0-1的字符串
{}:打括号里面可以给定任意数值,指定字符的重复次数
{0,}-->*
{1,}-->+
{0,1}-->?
{int} :重复的次数固定为int次
注意:上述匹配重复次数的元字符,会按照最多次进行匹配!也就是所谓的"贪婪匹配"!如果要修改这种默认的
贪婪匹配,可以再匹配规则的后面加上?就把规则变成了惰性匹配,即匹配最少的重复次数!
5.字符集:[]
*re.findall('x[yz]',"xyabxzxyz") #打印结果:['xy', 'xz', 'xy']
*[]里面的元字符会失去其本身的功能,变成一般字符!除了几个特殊的字符:
a-z:a到z的所有字符;^a-z:不是a到z的所有字符;\:转义
re.findall('X[a-z]*','Xawqqwe') #打印结果:['Xawqqwe']
re.findall('X[^a-z]*',"Xawqqwe") #打印结果:['X']
re.findall('\([^()]*\)','(12-2*(4-3*(5-3))') #打印结果:['(5-3)']
注意:()元字符,所以要转义;[]里面的()就不需要再通过\进行转义了。匹配规则是,以(开头,以)结尾,且
中间没有()了,并且括号里面的元素个数为*!目标就是找到最里面的括号内容
6.转义字符:\ 转义字符比较绕,注意理解!!!
*让没有意义的字符变得有意义
\d-->[0-9]
\D-->[^0-9]
\s:匹配空白字符
\S:匹配非空白字符
\w-->[0-9a-zA-Z]
\W:-->[^0-9a-zA-Z]
\b:匹配特殊字符边界 如:#,&等
*让有意义的字符变的没意义;例如让元字符失去特殊功能变成一般字符 \*,\.等等
例子:
import re
print(re.findall('I\\b',"I am pzz!")) #\\b会先交给python解释器进行转义-->\b,然后给到re模块,re认的\b不会再转义
print(re.findall(r'I\b',"I am pzz!"))#加上一个r,规则不会交给python解释器,而是直接给到re模块执行
import re
print(re.findall(r'I\\z',"I\zm")) #\\把转义字符转义成不同字符\,然后前面加上r,就是把I\z普通字符传给re进行匹配
print(re.findall('I\\\\z',"I\zm") #\\\\交给python解释器转义\\,之后交给re,re转义\\变成不同字符\,之后进行匹配
上述2个方法的返回值都是:['I\\z'] ,并不是['I\z'].这是因为规则传给python解释器进行转义之后再给到re模块转义,然后匹配到str中的
对应字符串,之后把符合规则的串返还给python解释器,python又把\做了一次转义,所以返回结果是\\双反斜杠的。这里面
做简单了解,匹配除结果就好了!
7.或:| (str1|str2 :匹配str1或str2,注意这里面字符串长度不一定是1)
re.findall('Ia|m',"Iampzz!") #返回结果是:['Ia', 'm']
8:分组:()
*re.findall("(abc)+","abcabc") #打印结果:['abc']
如果不同小括号进行分组,只会匹配+前面的一个字符,而加上之后可以对()里面的字符串进行+规则的匹配!由于()的
优先级问题,优先匹配()里面的内容,所以返回结果是['abc'].可以通过"(?:abc)+"取消优先级,这样返回结果是
['abcabcabc'].
*'(?P<key>匹配规则)'
re.search('(?P<name>[a-z]+)(?P<age>\d+)','alex12pzz13').group("name") #打印结果:'alex
re.search('(?P<name>[a-z]+)(?P<age>\d+)','alex12pzz13').group("age") #打印结果:'12'
注意:?P<name> :除了name可以任意,其他的都是固定格式。类似字典,通过key拿到对应分组的数值.如果不用上述格式
也可以:
re.search('([a-z]+)(\d+)','alex12pzz13').group() #打印结果:‘alex12’
第一方法可以通过key拿到不同分组的数值,而这个方法会把不同分组数值全打印!推荐第一种
*re下的方法:
*re模块的search与findall方法区别:findall方法会把符合规则的字符串以列表的形式返回;而search会把符合规则的字符串
以对象的形式返回,通过group方法获得字符串,而且search只会匹配第一个,不会匹配多个!
*re.match(str1,str2):只会从字符串的开头按照规则进行匹配且只会匹配一个结果,并且返回值是对象。
通过group方法获得匹配到的字符串(类似在search方法的规则前加^)
*re.split():
print(re.split(" ","abc abc abc")) #按照空格分割字符串
print(re.split("[| ]","abc abc|abc")) #按照空格或是|分割字符串
print(re.split("[ab]","abcabcabc")) #如果[]里面的字符在匹配字符串的前后都有则留下对应数量的'',如果在中间留下(个数-1)个''
注意:规则的字符串前后不要乱加空格,否则会发生意想不到的错误!
*re.sub(规则,str1,str2,int):把str2中符合规则的字符串用str1替换掉int次!返回结果是:替换后的字符串
re.subn(规则,str1,str2):返回结果是:(替换后的字符串,替换的次数)
*obj=re.compile(规则)
obj.findall(str)
上述两行代码等价于re.findall(规则,str)!上述方式的优势就是如果规则被多次使用,则这个方式方便
*re.finditer(规则,str):与findall方法一致,只是finditer返回值是可迭代对象,通过调用next方法迭代元素,而这个元素
是一个对象,在通过group方法获得符合规则的字符串!
*如果规则中存在(),则优先返回()里面匹配的内容;也可以通过(?:)去掉优先级!
re.findall("www\.(baidu|360)\.com","adfawww.baidu.comad") #返回结果:['baidu']
re.findall("www\.(?:baidu|360)\.com","adfawww.baidu.comad")#返回结果:['www.baidu.com']
*元字符:不是普通的字符,是特殊字符!
1:通配符:. 可以匹配除了换行符以外的任意一个字符
例子:re.findall('l..e',"abcloveabc") #匹配字符串中以l开头以e结尾且长度为4的字符串,若有多个则以列表的形式返回
2:^ :以什么开头,只能从str开头进行匹配
例子:re.findall('^l..e',"loveabc") #注意:只能从str的开头进行匹配,且^前不能加其他元字符
3:$:以什么结尾,只能从str结尾进行匹配
例子:re.findall('p.z$',"abcpzz") #返回结果:["pzz"]
4: *:匹配字符重复0-无穷次的字符串
例子: re.findall('p*','abpcppdp') #返回结果['','','p','','pp','','p']
re.findall('pz*',"abcpzzzz")#返回结果是['pzzzz']
re.findall('pz*',"abcp") #返回结果是:['p']
+:匹配字符重复1-无穷次的字符串 (要求匹配的字符重复次数至少是1)
例子:re.findall('pz+',"abcp") #返回结果是:[]
?:匹配字符重复0-1的字符串
{}:打括号里面可以给定任意数值,指定字符的重复次数
{0,}-->*
{1,}-->+
{0,1}-->?
{int} :重复的次数固定为int次
注意:上述匹配重复次数的元字符,会按照最多次进行匹配!也就是所谓的"贪婪匹配"!如果要修改这种默认的
贪婪匹配,可以再匹配规则的后面加上?就把规则变成了惰性匹配,即匹配最少的重复次数!
5.字符集:[]
*re.findall('x[yz]',"xyabxzxyz") #打印结果:['xy', 'xz', 'xy']
*[]里面的元字符会失去其本身的功能,变成一般字符!除了几个特殊的字符:
a-z:a到z的所有字符;^a-z:不是a到z的所有字符;\:转义
re.findall('X[a-z]*','Xawqqwe') #打印结果:['Xawqqwe']
re.findall('X[^a-z]*',"Xawqqwe") #打印结果:['X']
re.findall('\([^()]*\)','(12-2*(4-3*(5-3))') #打印结果:['(5-3)']
注意:()元字符,所以要转义;[]里面的()就不需要再通过\进行转义了。匹配规则是,以(开头,以)结尾,且
中间没有()了,并且括号里面的元素个数为*!目标就是找到最里面的括号内容
6.转义字符:\ 转义字符比较绕,注意理解!!!
*让没有意义的字符变得有意义
\d-->[0-9]
\D-->[^0-9]
\s:匹配空白字符
\S:匹配非空白字符
\w-->[0-9a-zA-Z]
\W:-->[^0-9a-zA-Z]
\b:匹配特殊字符边界 如:#,&等
*让有意义的字符变的没意义;例如让元字符失去特殊功能变成一般字符 \*,\.等等
例子:
import re
print(re.findall('I\\b',"I am pzz!")) #\\b会先交给python解释器进行转义-->\b,然后给到re模块,re认的\b不会再转义
print(re.findall(r'I\b',"I am pzz!"))#加上一个r,规则不会交给python解释器,而是直接给到re模块执行
import re
print(re.findall(r'I\\z',"I\zm")) #\\把转义字符转义成不同字符\,然后前面加上r,就是把I\z普通字符传给re进行匹配
print(re.findall('I\\\\z',"I\zm") #\\\\交给python解释器转义\\,之后交给re,re转义\\变成不同字符\,之后进行匹配
上述2个方法的返回值都是:['I\\z'] ,并不是['I\z'].这是因为规则传给python解释器进行转义之后再给到re模块转义,然后匹配到str中的
对应字符串,之后把符合规则的串返还给python解释器,python又把\做了一次转义,所以返回结果是\\双反斜杠的。这里面
做简单了解,匹配除结果就好了!
7.或:| (str1|str2 :匹配str1或str2,注意这里面字符串长度不一定是1)
re.findall('Ia|m',"Iampzz!") #返回结果是:['Ia', 'm']
8:分组:()
*re.findall("(abc)+","abcabc") #打印结果:['abc']
如果不同小括号进行分组,只会匹配+前面的一个字符,而加上之后可以对()里面的字符串进行+规则的匹配!由于()的
优先级问题,优先匹配()里面的内容,所以返回结果是['abc'].可以通过"(?:abc)+"取消优先级,这样返回结果是
['abcabcabc'].
*'(?P<key>匹配规则)'
re.search('(?P<name>[a-z]+)(?P<age>\d+)','alex12pzz13').group("name") #打印结果:'alex
re.search('(?P<name>[a-z]+)(?P<age>\d+)','alex12pzz13').group("age") #打印结果:'12'
注意:?P<name> :除了name可以任意,其他的都是固定格式。类似字典,通过key拿到对应分组的数值.如果不用上述格式
也可以:
re.search('([a-z]+)(\d+)','alex12pzz13').group() #打印结果:‘alex12’
第一方法可以通过key拿到不同分组的数值,而这个方法会把不同分组数值全打印!推荐第一种
*re下的方法:
*re模块的search与findall方法区别:findall方法会把符合规则的字符串以列表的形式返回;而search会把符合规则的字符串
以对象的形式返回,通过group方法获得字符串,而且search只会匹配第一个,不会匹配多个!
*re.match(str1,str2):只会从字符串的开头按照规则进行匹配且只会匹配一个结果,并且返回值是对象。
通过group方法获得匹配到的字符串(类似在search方法的规则前加^)
*re.split():
print(re.split(" ","abc abc abc")) #按照空格分割字符串
print(re.split("[| ]","abc abc|abc")) #按照空格或是|分割字符串
print(re.split("[ab]","abcabcabc")) #如果[]里面的字符在匹配字符串的前后都有则留下对应数量的'',如果在中间留下(个数-1)个''
注意:规则的字符串前后不要乱加空格,否则会发生意想不到的错误!
*re.sub(规则,str1,str2,int):把str2中符合规则的字符串用str1替换掉int次!返回结果是:替换后的字符串
re.subn(规则,str1,str2):返回结果是:(替换后的字符串,替换的次数)
*obj=re.compile(规则)
obj.findall(str)
上述两行代码等价于re.findall(规则,str)!上述方式的优势就是如果规则被多次使用,则这个方式方便
*re.finditer(规则,str):与findall方法一致,只是finditer返回值是可迭代对象,通过调用next方法迭代元素,而这个元素
是一个对象,在通过group方法获得符合规则的字符串!
*如果规则中存在(),则优先返回()里面匹配的内容;也可以通过(?:)去掉优先级!
re.findall("www\.(baidu|360)\.com","adfawww.baidu.comad") #返回结果:['baidu']
re.findall("www\.(?:baidu|360)\.com","adfawww.baidu.comad")#返回结果:['www.baidu.com']
本文详细介绍Python中re模块的正则表达式使用方法,包括元字符、字符集、分组、转义字符等核心概念及其应用实例。
4412

被折叠的 条评论
为什么被折叠?



