re模块
match匹配
匹配字符串的开头,即只有开头包含正则的内容才算数。
语法:
re.match(pattern,string,flags=)
pattern
为正则表达式string
为需要匹配的字符串flags
为一些特殊的标志,比如re.I代表忽略大小写
匹配后的返回值:
匹配成功:返回一个匹配的对象,使用这个对象的span()方法可以输出匹配的字符串的下标范围(左闭右开)。
匹配失败:返回None
import re
print(re.match(r'\d{2}', '12333'))
print(re.match(r'\d{2}', '12333').span())
运行结果:
(0, 2)
注意:这里的r代表raw的意思,我们需要把表达式原封不动的告诉解释器,防止它被转义。
search匹配
扫描整个字符串,并返回第一个成功的匹配。
语法:
re.search(pattern,string,flags=)
pattern
为正则表达式string
为需要匹配的字符串flags
为一些特殊的标志,比如re.I代表忽略大小写
匹配后的返回值:
匹配成功:返回一个匹配的对象,使用这个对象的span()方法可以输出匹配的字符串的下标范围(左闭右开)。
匹配失败:返回None
示例:
import re
print(re.search(r'\d{2}', 'qq12333', flags=re.I))
print(re.search(r'\d{2}', 'qqq12333').span())
运行结果:
(3, 5)
findall匹配
扫描整个字符串,并返回所有成功的匹配。
语法:
re.findall(pattern,string,flags=)
pattern
为正则表达式string
为需要匹配的字符串flags
为一些特殊的标志,比如re.I代表忽略大小写
匹配后的返回值:
匹配成功:返回一个列表,列表中为匹配的字符串。
匹配失败:返回None
示例:
import re
print(re.findall(r'\d{2}', 'qq12333', flags=re.I))
print(re.findall(r'\d{2}', 'qqq12333'))
运行结果:
['12', '33']
['12', '33']
正则元字符
元字符 | 说明 |
---|
. | 匹配任意一个字符,除了换行符 |
[] | 匹配中括号中的任意一个字符,如[0-9a-ZA-Z_] |
[^sunck] | 匹配除了sunck以外的任意一个字符,^在中括号中为脱字符 |
\d | 匹配任意一个数字,等价于[0-9] |
\D | 匹配任意一个非数字,等价于[^0-9] |
\w | 匹配任意一个字母、数字及下划线,等价于[0-9a-zA-Z_] |
\W | 匹配任意一个非字、数字及下划线 |
\s | 匹配任意一个空白符(空格、换行、回车、换页、制表) |
\S | 匹配任意一个非空白符 |
锚字符:
锚字符 | 说明 |
---|
^ | 行首匹配,在re.M的配合下支持换行匹配 |
$ | 行尾匹配 |
\A | 匹配字符串开始,与^区别在于不支持对换行匹配re.M |
\Z | 匹配字符串结束,与^区别在于不支持对换行匹配re.M |
\b | 匹配单词和空格间的位置 |
\B | 匹配非单词边界 |
匹配多个字符:
多字符 | 说明 |
---|
(xyz) | 匹配小括号内的xyz,xyz是一个整体 |
x? | 匹配0个或1个x |
x* | 匹配0个或任意多个x |
x+ | 匹配至少1个x |
x{n} | 匹配n个x |
x{n,} | 匹配至少n个x |
x{n,m} | 匹配至少n个,最多m个x |
x|y | 匹配x或y |
split切割
使用re.split(pattern,string)
可以用来切割字符串,返回一个列表。
比字符串的split()函数强大。
finditer函数
re.finditer(pattern,string,flags=)
扫描整个字符串,返回的是一个迭代器,可以解决findall()
数据量过大的问题。
sub和subn函数
提供字符串的替换和修改功能。
re.sub(pattern,repl,string,count=0,flags=0)
,返回值为替换后的字符串。
subn()与sub()类似,只是返回值形式不同,subn返回的是一个元组,元组中包含替换后的字符串和替换的次数。
- pattern:正则表达式
- repl:替换后的字符串
- string:目标字符串
- count:最多替换次数,如果不指定将替换所有的字符串
分组
用来提取匹配的字符串,用()表示分组。
tel = '010-999999'
m = re.match(r'(\d{3})-(\d{6})',tel)
# group(0)为tel这个原始字符串
print(m.group(0))
# group(1)为第一个括号的内容
print(m.group(1))
# group(2)为第二个括号的内容
print(m.group(2))
# groups()为整个分组的信息,元组
print(m.groups())
compile编译
当我们使用正则表达式时,re模块会干两件事:
- 编译正则表达式,如果正则本身不合法会报错
- 用编译后的正则去匹配对象
语法:
1、编译正则,相当于创建一个匹配的对象
re_tel = re.compile(pattern,flags=)
2、匹配
re_tel.match(string)
注意:这个对象有match、search、findall、finditer、sub(n)、split方法。