【语法进阶】高级用法、贪婪与非贪婪
1.search():扫描整个字符串并返回第一个成功匹配的对象,如果匹配失败,就返回None
import re
res = re.search('\d','djkjlli2n') #\d匹配数字
print(res.group())
2.findall()
作用: 以列表形式返回整个字符串中所有匹配到的字符串
2.2 简单使用
1.导入模块
import re
2. 使用findall()进行匹配操作
re.findall(pattern, string, flags=0):从头到位匹配,找到所有匹配成功的数据,返回一个列表。如果没有找到匹配的,则返回空列表。
pattern: 匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,如是否区分大小写,是否多行匹配等,多数情况下使用不到。
import re
res = re.findall("\d", "123abc!@#123") # 匹配所有数字
print(res) # ['1', '2', '3', '1', '2', '3']res = re.findall("\w{3}", "pythonth")
print(res) # ['pyt', 'hon']
注意:比起match(),findall()更为常用
总结
match()从头开始匹配,匹配成功返回match对象,通过group()进行提取,匹配失败就返回None,只匹配一次
search():从头到尾匹配,匹配成功返回第一个成功匹配的对象,通过group进行提取,匹配失败返回None,只匹配一次
findall():从头到尾匹配,匹配成功返回一个列表,匹配所有匹配成功的数据,不需要通过group()进行提取。没有group方法
3.sub(正则表达式,新内容,字符串,指定替换的次数) 将匹配到的数据进行替换
注意: 正则表达式代表需要被替换的,也就是字符串里面的旧内容
import re
res = re.sub('python','bingbing','hellopython')
print(res) #hellobingbing
# res = re.sub('\d','2','这是这个月的第15天')
# print(res) #这是这个月的第22天,没有设置次数默认全部替换
# res = re.sub('\d','2','这是这个月的第15天',1)
# print(res) #这是这个月的第25天
4. split(pattern, string,maxsplit)
pattern 正则表达式
string 字符串
maxsplit指定最大分割次数
import re
res = re.split("s","hello, python") #没有s所以不分割
# res = re.split("|","hello, python") #这个符号会都分割
# res = re.split("o","hello, python")
print (res)
3. 贪婪与非贪婪
贪婪匹配:在满足匹配时,匹配尽可能长的字符串(即有多少匹配多少),默认情况下,采用贪婪匹配。
res = re.match('em*','emmmm...') # *修饰的是字符m匹配0此到无数次
print(res.group()) # emmmm
默认情况下是贪婪匹配:有多少匹配多少
非贪婪匹配
在满足匹配时,匹配尽可能短的字符串(即能不匹配就不匹配,按照最少匹配次数进行匹配),使用?来表示非贪婪匹配。
在*,+,{m,n}等后面加上?,表示使贪婪变成非贪婪
res = re.match('em*?','emmmm...') # *修饰的是字符m
print(res.group()) # e
此时?修饰*,非贪婪时尽可能少的,*匹配前一个字符0个或无限个,?表示匹配前一个字符0个或者1个,所以*取的次数时0次,m的0个是空字符串
res = re.match('em+?','emmmm...')
print(res.group()) # em
?修饰+,+匹配前一个字符1次或无限次,?表示匹配前一个字符0次或1次,所以取的次数最少是1次
res = re.match('m*','mmmmm')
print(res.group()) # mmmmm
res = re.match('m*?','mmmmm')
print(res.group()) #
# 字符串是mmmmm,开头匹配m,*最少是0个,所以一个m都没有匹配到。
res = re.match('m{1,5}','mmmmm')
print(res.group()) # mmmmm,默认是贪婪匹配,匹配最多次数5
res = re.match('m{1,5}?','mmmmm')
print(res.group()) # 加上?,非贪婪匹配,匹配最少次数1
原生字符串
print('lalal\t') #结果lalal
print(r'lalal\t') #结果lalal\tres = re.match("\\\\" , "\game") ##正则表达式中,匹配字符串中的字符\需要\\\\
res = re.match(r"\\" , "\game") #加了r(原生字符串)是2个代表一个
print (res.group())