import re
语法:
re.match(pattern, str,flag)
参数:match:表示只从字符串的开始处开始匹配,如果没有匹配上则返回None,匹配上返回一个match对象,可以使用match对象.group()函数取到匹配成功的字符串。
pattern:正则表达式的规则
str:表示需要匹配的字符串
flag:标记,可以不写
re.search(pattern, str,flag) 寻找整个字符串,查找匹配项,返回第一个匹配项,返回的类型为一个match对象,可以使用group()函数取到匹配到的值,若没有匹配到,则会报错
re.findall(pattern, str,flag) 找到字符串中所有匹配项,返回一个列表套元组类型,若没有匹配到则返回一个空列表。
匹配单个字符与数字:
. :表示可以匹配除了换行符(\f\n\r\t)之外任意的单个字符
[245] :表示匹配括号中任意一个字符(即匹配2或4或5)
[0-9] :表示匹配0到9范围内任意一个数字(相当于\d)
[a-z] :表示匹配到a到z范围内任意一个小写字母
[A-Z] :表示匹配A到Z范围内任意一个大写字母
[0-9a-zA-Z]:表示匹配任意一个数字或字母(中间不加逗号)(相当于\w)
[0-9a-zA-Z_]:表示匹配任意一个数字或字母或下划线
[^a-z]:表示除了a到z之外任意一个字符
\D : 表示除了数字外任意一个字符
\W:表示除了数字,字母下划线外任意一个字符
\S :表示除了特殊字符以外的任意符号(特殊符号包括空格’ ’,换页’\f’,换行’\n’,回车’\r’,制表’\t’)
\s:匹配任意空白字符,等价于[ \t \n \r \f ]
边界字符:
定义:用来表述字符的边界,包括字符的开始,结束和是否是单词的结束。
‘M’模式表示多行匹配 re.M
’S’模式表示包括换行符在内的所有字符 re.S
‘I’模式不区分大小写 re.I
^ : 行首匹配,在’M’模式下,会匹配新一行的行首(注意:与[^]意义不同)
$ : 行尾匹配,在’M’模式下,会去匹配新一行的行尾
\A : 表示行首,只匹配整个字符串的开头,在’M’模式下不会匹配其他行的行首
\Z : 表示行尾,只匹配整个字符串的末尾,在’M’模式下不会匹配其他行的行首
\b : 表示匹配英文单词的边界,指的是单词和空格间的位置
\B : 表示匹配非英文单词边界
匹配一定个数的字符:(假设:x,y,z表示任意的字符,m,n表示正整数)
x?:表示0个或者1个x
x* :表示可以匹配0个或者多个x(例如:*表示匹配0个或者多个除了换行符之外的字符)
x+:表示匹配至少1个x(例如:.+ 表示匹配至少1个除了换行符之外的字符)
(xyz): 表示将x,y,z看成一个整体
x{n} :表示n个x
x{n,} :表示最少匹配n个x
x{n,m} : 表示至少有n个,最多有m个x
x | y :表示x或者y
Compile
—将正则表达式编程成一个正则对象,提高运行效率
import re
pattern = re.compile('[a-zA-Z]')
result = pattern.findall('as3SiOPdj#@23awe')
print result
# ['a', 's', 'S', 'i', 'O', 'P', 'd', 'j', 'a', 'w', 'e’]
同样:sub、match、group都适用
split分割,sub 与 subn区别:
import re
s = '90hello1234disen96758what8899go768hi234'
# 分割
sn = re.split('[a-z]+',s) # 返回一个列表
# 清洗数据
sn = list(filter(lambda x: x != '',sn))
print(sn)
# 替换 将所有字母变成逗号
s_ = re.sub('[a-z]+',',',s) # 返回一个替换后的字符串
s_2 = re.subn('[a-z]+',',',s) # 返回一个元组,第一个位置是替换后的字符串,第二个位置是替换的次数
print(s_)
print(s_2)
结果:
['90', '1234', '96758', '8899', '768', '234']
90,1234,96758,8899,768,234
('90,1234,96758,8899,768,234', 5)
例:sub第二个参数可以为一个自定义函数
import re
# 将匹配的数字乘以 2
def double(matched):
value = int(matched.group('value'))
return str(value * 2)
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))
运行结果:
A46G8HFD1134
group、groups、groupdict
import re
s = '010-88593829'
#带分组名
r2 = re.match('(?P<first>\d{3})-(?P<last>\d{8})',s)
print(r2)
print(r2.group())
print(r2.groups()) # 返回元组
print(r2.groupdict()) # 返回字典,前提在匹配的正则中通过?P<name>指定分组名
# 练习:从给定的字符串中读取到姓名和手机号
ss = '<h1>disen</h1>
<span>手机号:17793457782</span>'
ss_1 = 'disen:18873473382'
r3 = re.match('(\w+):([1][3-9]\d{9}$)',ss_1)
print(r3.group())
print(r3.groups())
# .*表示任意多个字符
r3_ = re.match('<h1>([a-zA-Z]+)</h1>.*<span>.*:([1][3-9]\d{9})</span>',ss)
print(r3_.groups())
结果:
<_sre.SRE_Match object; span=(0, 12), match='010-88593829'>
010-88593829
('010', '88593829')
{'first': '010', 'last': '88593829'}
disen:18873473382
('disen', '18873473382')
('disen', '17793457782’)
findall
import re
s = 'hello,disen,phone is 17791692095,is18766355533'
result = re.findall('([a-z]{2})([1][3-9]\d{9})',s)
print(type(result)) # 返回list
print(result)
查找图片地址 src的属性值
s_ = '''
<img src="cc.jpg" width=400 height=300>
<img src="fc.jpg" width=500 height=700>
<img src="yc.jpg" width=600 height=3200>
<img src="ec.jpg" width=200 height=3600>
<img src="nc.jpg" width=700 height=700>
'''
img = re.findall(‘src=”(.*)” width=(\d+) height=(\d+)’,s_)
print(img) # 返回list,每个元素是一个元组
print()
结果:
[(‘cc.jpg’, ‘400’, ‘300’), (‘fc.jpg’, ‘500’, ‘700’), (‘yc.jpg’, ‘600’, ‘3200’), (‘ec.jpg’, ‘200’, ‘3600’), (‘nc.jpg’, ‘700’, ‘700’)]