Python之正则表达式

目录

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']
版权声明:个人原创,若转载,请注明出处

你可能感兴趣的:(Python之正则表达式)