目录
1、 正则表达式基本使用,元字符,预定义字符
2、 python的正则表达式re模块
为了方便讲解,首先讲一下re模块最简单的用法
import re #内置模块
#编译,就是我们要匹配的规则,这里之所以要编译一下,是因为python内部的优化,如果后面多次使用这个规则,效率则会提升
pattern = re.compile('sun')
#match方法:从头匹配
#str = "sun111"
str = "111sun"
match = pattern.match(str)
#这里也就是说这里
#当str是sun111时,控制台就输出sun,表示匹配成功
#当str是111sun时,控制台就输出None,表示匹配失败
if match:
print(match.group())
else:
print(match)
一、 正则表达式基本使用,元字符,预定义字符
1.1、元字符
元字符 | 含义 | 用法 |
---|---|---|
点号: . | 可以匹配任意字符(\n除外) |
re.match('sun.', 'sunA') #匹配成功 re.match('sun.', 'sun@') #匹配成功 re.match('sun.', 'sun5') #匹配成功 re.match('sun.', 'sun\n') #匹配失败 |
星号: * | 可以匹配某字符0次、1次、n次 |
print(re.findall("qwer*", 'qwe'))#匹配r 0 次成功 print(re.findall("qwer*", 'qwer'))#匹配r 1 次成功 print(re.findall("qwer*", 'qwerrrrr'))#匹配r n 次成功 |
加号: + | 可以匹配某字符1次、n次 |
print(re.findall("qwer+", 'qwe'))#匹配r 0 次失败功 print(re.findall("qwer+", 'qwer'))#匹配r 1 次成功 print(re.findall("qwer+", 'qwerrrrr'))#匹配r n 次成功 |
问号:? | 某字符要么没有(0次),要么只有1次 |
print(re.findall("sun?w", 'fsunw'))#匹配成功 print(re.findall("sun?w", 'fsuw'))#匹配成功 print(re.findall("sun?w", 'fsunnw')) #匹配失败 |
上括号: ^ | 匹配开头 |
re.findall("^sun", 'sun11111'))#匹配成功(sun) re.findall("^sun", '11sun111') #匹配失败 |
美元符: $ | 匹配结尾 |
re.findall("sun$", '11111sun')#匹配成功(sun) re.findall("sun$", 'sun11111') #匹配失败 |
或符号: | | 或者条件 |
re.findall("sun|qi", 'sun11')#匹配成功 re.findall("sun|qi", '11qi')#匹配成功 re.findall("sun|qi", 'sun11qi')#匹配成功 re.findall("sun|qi", 'aaaaa') #匹配失败 |
花括号: {} | {3}:匹配前一个字符3次 {1,3}:匹配前一个字符1到3次 {3,}:匹配前一个字符3次以上 |
re.findall("a{1}b{2}c{3}", 'abbccc')#匹配成功 print(re.findall("a{4,}", 'aaa')#匹配失败 re.findall("a{4,}", 'aaaa')#匹配成功 |
中括号: [] | 字符集 [abc]{2}:只要字符满足在中括号中存在,就保留,匹配两次 |
匹配:re.findall("[abc]{2}", 'abebccc') 结果:['ab', 'bc', 'cc'] 分析:首先匹配a,在字符集[]中,保留, 再匹配一次,开始匹配b,满足条件, 这时得到第一个结果ab。 然后开始匹配e,不满足条件, 开始匹配b....以此类推 |
小括号: () | 分组 |
匹配:re.match("(sun){1}([abc]{2})", 'sunaaa').groups() 结果:('sun', 'aa') |
1.2、预定义字符
预定义字符 | 含义 |
---|---|
\d |
0-9 |
\D |
非数字 |
\s |
匹配任意空白字符 空白字符包括空格、\n、\t、\v、\f、\r |
\S |
非空白字符 |
\w |
[ a-z, A-Z, 0-9,_ ] |
\W |
与\w相反的字符,比如#@之类的,不包括汉字 |
\A |
匹配开头,与 ^ 相似 |
\Z |
匹配结尾,与 $ 相似 |
\b |
边界字符 |
\B |
非边界字符 |
二、python的正则表达式re模块
2.1、match方法
一个参数
就是从头开始匹配
pattern = re.compile('sun')
result = pattern.match('sunqiyong')
if result:
print(result.group())
#输出结果:sun
compile 第二个参数
可以改变匹配规则
pattern = re.compile('sun.')
result = pattern.match('sun\n')
if result:
print(result.group())
#没有输出结果
pattern = re.compile('sun.',re.S)
result = pattern.match('sun\n')
if result:
print(result.group())
#输出结果:sun
#总结,就是加入参数re.S,就可以让点号不受\n的影响
2.2、search 方法
相比较于match函数,都是从开头开始匹配,是不过search方法是如果开头匹配不上,会继续向后匹配
p = re.compile('cici')
match = p.search('123cicijjfcicioi')
if match:
print(match.group()) #输出结果:cici
print(match.start()) #输出结果:3 角标3
print(match.end()) #输出结果:7 角标7
print(match.span()) #输出结果:(3, 7) 匹配结果角标区间,包左不包右
2.3、分组 信息
p = re.compile('([a-z]{3})([a-z]{2})([0-9]{2})([A-Z]{2})')
match = p.search('sunci55PY')
if match:
print(match.groups()) #输出结果('sun', 'ci', '55', 'PY')
2.4、findall方法
p = re.compile('\d{2}')
match = p.findall('sunci55PY23')
print(match)#输出结果 ['55', '23']
2.5、finditer方法
和findal比较相似,匹配之后返回的对象是--->迭代器
p = re.compile('\d{2}')
match = p.finditer('benci55PY23')
for item in match:
print(item.group())
#输出结果 55 23
2.6、sub方法 主要是替换的功能
p = re.compile('\d+')
#参数一 新的内容,要替换成的内容
#参数二 旧的内容,要被替换的内容
#参数三 替换的次数
match = p.sub('www','aaa5555aa33aa222aaa',2)
print(match)#输出结果 aaawwwaawwwaa222aaa
2.7、subn方法 主要是替换的功能
str = 'aaa5555aa33aa222aaa'
#参数一 匹配规则
#参数二 新的内容,要替换成的内容
#参数三 旧的内容,要被替换的内容
match = re.subn('\d+', 'qq', str)
print(match)# 输出结果 ('aaaqqaaqqaaqqaaa', 3)
2.8、aplit方法 字符串切割
pattern = re.compile(':')#用 : 切割字符串
result = pattern.split('2017:12:12 09:21:45')
print(result)#输出结果 ['2017', '12', '12 09', '21', '45']
print(re.split('\W','sqy android 2018'))
#输出结果 ['sqy', 'android', '2018']
版权声明:个人原创,若转载,请注明出处