用来匹配字符串(动态、模糊的匹配)
如查找某个人,姓陈,两个字;即后面那个字是模糊的;
常用函数
’ . ‘(一点):匹配任意一个字符;
’ ^ ‘:匹配字符开头(\A )
$ :匹配字符结尾 (\Z )
re.match():从头开始匹配。
import re
#在后面的字符串中查找前面的格式内容
res = re.match("^Bull","RedBull321")
res.group() #可以查看匹配到了什么
res = re.match("^Bull\d","RedBull321")
res.group()
>> 'Bull3' #匹配一个数字
res = re.match("^Bull\d+","RedBull321")
res.group()
>> 'Bull321' #匹配多个数字
re.search():
# 取Bull 如果有多个,只取第一个
re.search("B[a-z]+l","RedBull321")
>> <_sre.SRE_Match object; span=(3, 7), match='Bull'>
# 中间有大写
re.search("B[a-zA-Z]+l","RedBuAll321RedBull")
>> <_sre.SRE_Match object; span=(3, 8), match='BuAll'>
# 匹配#之间的字符
re.search("#.+#","RedBuAll321#RedBull#hello")
re.findall(): 找到所有的匹配
re.split(): 分割
# 按数字进行分割(1个数字)
re.split("[0-9]","abc12de3f45gh")
['abc', '', 'de', 'f', '', 'gh'] #因为是1个数字,所以中间有空格
# 按数字进行分割(不限多少个)
re.split("[0-9]+","abc12de3f45gh")
['abc', 'de', 'f', 'gh']
re.sub(): 替换
# 前面是匹配的项,后面是替换的项
re.sub("[0-9]+","|","abc12de3f45GH")
'abc|de|f|GH'
常用符号
- ? : 匹配前一个字符1次或0次;(问号前的字符可以有,可以没有)
# 匹配前一个字符(问号前的一个字符可以匹配1次,也可以匹配0次)
#即前两个aa必须要有,挨着?的a可以没有
re.search("aaa?","aaEvanaaaaa")
<_sre.SRE_Match object; span=(0, 2), match='aa'>
- {m} : m为数值,说明匹配多少次
- {n,m}: 匹配n-m次
# [0-9]{3}即0-9范围内的数字匹配3次
re.search("[0-9]{3}","aa1x2a345aa")
<_sre.SRE_Match object; span=(6, 9), match='345'>
# 不固定匹配多少次(如匹配1-3次)
re.search("[0-9]{1,3}","aa1x2a345aa")
<_sre.SRE_Match object; span=(2, 3), match='1'>
# 如果要把其中的数字都匹配出来
re.findall("[0-9]{1,3}","aa1x2a345aa")
['1', '2', '345']
- |: 匹配左或右的字符
# 匹配abc或ABC(从左往右先匹配到的ABC)
re.search("abc|ABC","ABCBabcCD").group()
'ABC'
# findall可以把两个都匹配到,没有group()方法
re.findall("abc|ABC","ABCBabcCD")
['ABC', 'abc']
- (…): 分组匹配
# abc匹配两次
re.search("(abc){2}","Evanabcabc").group()
'abcabc'
- \: 转义,意思是不要将后面带的符号作为语法
# 如要匹配管道符
re.search("(abc){2}\|","Evanabcabc|").group()
'abcabc|'
- \d: 匹配数字
- \D: 匹配非数字(所有非数字的字符)
# 匹配非数字的所有字符
re.search("\D+","123ba\r\d").group()
'ba\r\\d'
- \w: 匹配[A-Za-z0-9] (大小写字母+数字)
- \W: 匹配非[A-Za-z0-9]
# 匹配除了字母和数字以外的字符
re.search("\W+","123ba\r\d").group()
'\r\\'
- \s: 匹配\r \n \t等
# \r \n \t
re.search("\s+","1ddDF23$- \r\n ")
<_sre.SRE_Match object; span=(9, 16), match=' \r\n '>
- 分组匹配:可以直接取为字典形式
re.search("(?P<id>[0-9]+)","abcd1234dada@233").group()
'1234'
re.search("(?P<id>[0-9]+)","abcd1234dada@233").groupdict()
{'id': '1234'}
# 再多匹配一组
re.search("(?P<id>[0-9]+)(?P<name>[a-zA-Z]+)","abcd1234dada@233").groupdict()
{'id': '1234', 'name': 'dada'}
例如,利用分组匹配,剥离身份证号信息:
re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{8})","410303199502116789").groupdict()
{'birthday': '19950211', 'city': '03', 'province': '4103'}
- flags=re.MULTILINE: 改变匹配的大小写形式
- re.I (re.IGNORECASE) :忽略大小写(括号内为完整写法)
- re.M (MULTILINE):多行模式,改变^和$的行为
- re.S (DOTALL):点任意匹配,改变 . 的行为。
# 前面匹配小写字母,要把后面大写也匹配上
re.search("[a-z]+","abcdA",flags = re.I).group()
'abcdA'