#import re
一、我们就re模块(也叫正则模块)介绍:
实现一个编译查找,一般在日志处理或者文件处理时用的比较多
正则表达式主要用于模式匹配和替换工作。
预定义字符集匹配:
d:数字0-9
D:非数字
s:空白字符
:换行符
:回车符
re模块数量词匹配:
符号^:表示的匹配字符以什么开头
符号$:表示的匹配字符以什么结尾
符号*:匹配*前面的字符0次或n次
eg:ab* 能匹配a 匹配ab 匹配abb
符号+:匹配+前面的字符1次或n次
符号?:匹配?前面的字符0次或1次
符号{m}:匹配前一个字符m次
符号{m,n}:匹配前一个字符m到n次(包括n次),m或n可以省略,mn都是
正整数
1、match (读音:马区,意思:匹配)
从第一个字符开始匹配,如果第一个字符不是要匹配的类型、则匹配失败并报错
注意:如果规则带了'+',则匹配1次或者多次,无'+'只匹配一次
2、search(读音:色区 ,意思:搜索)
从第一个字符开始查找、一找到就返回第一个字符串,找到就不往下找,找不到则报错
3、findall (意思:查找所有匹配结果)
从第一个字符开始查找,找到全部相关匹配为止,找不到返回一个列表[]
4、compile(读音:肯排偶 意思:编译)
编译模式生成对象,找到全部相关匹配为止,找不到返回一个列表[]
1、match方法
match 方法用于从字符串的头部开始匹配,仅返回第一个匹配的结果~
pattern.match(string[, pos[, endpos]]) 或 re.match(pattern, string[, flags])
pattern.match(string[, pos[, endpos]]) 中的 pos,endpos指定字符串匹配的起始和终止位置,这两个均为可选参数,若不指定,默认从字符串的开头开始匹配~
# a="2233113abf123"
#匹配当前字符串中的:d规则 整数 1个整数 ,匹配到后则不贪婪,如果匹配第一个值不少d 的格则抛异常
# yy=re.match("d",a)
# print (yy.group())
#打印结果:2
# #带+ 和不带+号的区别:不带+号则值匹配一个或一次,
# #带+号则匹配1词或多次
# y1=re.match( 'd+',a)
# print (y1.group())
# c="a123asdf12" #注意不能以字母开头
# y=re.match('d',c)
# print(y.group())
#运行结果:有问题 AttributeError: 'NoneType' object has no attribute 'group'
import re
#re.match 从字符串的起始位置开始匹配,如果起始位置匹配不成功的话,match()就返回none
#a="2233113abf123"
#yy=re.match(' ,a')
#print(yy.group())
# 打印结果:TypeError: match() missing 1 required positional argument: 'string'
#意思是:TypeError: match()缺少1个必需的位置参数:'string'
#大写的D:匹配非数字
# c="@@##!!abc123sad"
# y=re.match("D{4}","c")
#print(y.group()) #报错了
#
# y1=re.match("D{3,10}","c")
# print(y1.group())
# y1=re.match('D+',c)
# print(y1.group()) #打印结果显示:@@##!!abc
2、compile方法
re.compile(pattern[, flag])
步骤: 1)使用 re.compile 方法(传入正则表达式)得到 Pattern 对象 2)通过 Pattern 对象提供的方法对字符串进行匹配查找,返回一个 Match 对象(包含了匹配结果) 3)使用 Match 对象提供的方法获取匹配结果
示例:
import re pattern = re.compile(r'd+') # 返回一个 Pattern 对象 m = pattern.match('123abc456') # 返回一个 Match 对象 print(m.group()) # 输出匹配结果:123
示例中的 compile 方法用于编译正则表达式,返回一个 Pattern 对象,可利用 Pattern 对象中的一系列方法对字符串进行匹配查找。Pattern 对象中的常用方法包括:match,search,findall,finditer,split,sub,subn。当然这些方法也可以使用 re模块直接调用# 输出匹配的完整字符串 print(m.group()) # 123abc456 # 同上,输出匹配的完整字符串 print(m.group(0)) # 123abc456 # 从匹配的字符串中获取第一个分组 print(m.group(1)) # 123 # 从匹配的字符串中获取第二个分组 print(m.group(2)) # abc # 从匹配的字符串中获取第三个分组 print(m.group(3)) # 456 # 从匹配的字符串中获取所有分组,返回为元组 print(m.groups()) # ('123', 'abc', '456') # 获取第二个分组 在字符串中的起始位置(分组第一个字符的索引),start方法的默认参数为0,即字符串的起始索引 print(m.start(2)) # 3 # 获取第二个分组 在字符串中的起始位置(分组最后一个字符的索引+1),通start方法,end方法的默认参数也为0,即字符串结尾的索引+1 print(m.end(2)) # 6 # 第三个分组的起始和结束位置,即 (start(3), end(3)) print(m.span(3)) # (6, 9) # 同 (start(), end()) print(m.span()) # (0, 9)
# import re
# a="1!2!3!4asdf567"
# # yy =re.findall("d",a)
# # print(yy)
# # #打印结果:['1', '2', '3', '4', '5', '6', '7']
# # y1 =re.findall("d+",a)
# # print (y1)
# # #打印结果:['1', '2', '3', '4', '567']
# y2=re.findall("D" ,a)
# print(y2) #打印结果:['!', '!', '!', 'a', 's', 'd', 'f']
# y3=re.findall('D+',a)
# print(y3)#打印结果:['!', '!', '!', 'asdf']
# y4=re.findall('+{2}',a)
# print(y4)#打印结果: []
# y5=re.findall('d{1,4}',a)
# print (y5) #打印结果:['1', '2', '3', '4', '567']
import re
yy =re.compile('d') #['1', '2', '3', '4', '5', '6', '7']
y1 =re.compile('d+') #['1', '2', '3', '4', '567']
y2 =re.compile('D') #['!', '!', '!', 'a', 's', 'd', 'f']
y3 =re.compile('D+') #['!', '!', '!', 'asdf']
#
3、findall 方法
match方法 和search方法 仅会返回一个结果,findall方法会将字符串中的所有匹配结果以列表的形式返回,注意,返回的是列表,不是 Match 对象~
indall(string[, pos[, endpos]]) # 可选参数 pos,endpos 用于指定查找的起始位置和结束位置,默认 pos 为0,endpos为字符串长度
all=yy.findall('1!2!3!4asdf567')
print(all) #['1', '2', '3', '4', '5', '6', '7']
a1=y1.findall('sdafdsa')
print(a1) #[]
a2=y2.findall('123456sdafdsa123456')
print (a2) #打印结果:['s', 'd', 'a', 'f', 'd', 's', 'a']
a3=y3.findall('123safds123')
print(a3) #打印结果:['safds']
c="nihaohello,henhaohello"
y3=re.compile('hello')
a=y3.findall(c)
print (a) #显示结果['hello', 'hello']
pattern = re.compile(r'[a-z]+')
res = pattern.findall('123abc456cde')
print(res)
2、search 方法 ( 读音:色区 ,意思:搜索,寻找商品)
不同于match方法的从头开始匹配,search方法用于在字符串中的进行查找(从左向右进行查找),只要找到一个匹配结果,就返回 Match 对象,若没有则返回None~
search(string[, pos[, endpos]]) # 可选参数 pos,endpos 用于指定查找的起始位置和结束位置,默认 pos 为0,endpos为字符串长度
4、
pattern = re.compile('([0-9]*)([a-z]*)([0-9]*)') m = pattern.match('123abc456')