一、正则表达式
元字符
\d
digit,数字(等效:[0-9])
\d+
匹配连续的数字
\D
非数字
\D{3}
匹配连续的非数字
\w
word,单词([A-Z0-9a-z_])
\w{6}
6个单词字符
\W
非单词(单词是指标识符)
\W{3}
3个非单词字符
\s
space,空白字符([\t\r\n])
\s{2}
2个空白字符
\S
非空白字符
\S{3}
3个非空白字符
通配
.
除开换行的任意字符
.{3}
3个任意字符(换行除外)
量词
?
有一个或没有(0、1)
\d?
最多匹配一个数字
*
任意个数(0、1、2、3….)
\d*
匹配任意个数的数字
+
至少一个(1、2、3、4…)
[a-z]+
匹配一个以上的字母
数量
{m}
m个(x==m个)
\d{3}
精确匹配3个数字
{m,n}
m到n个(m<=x<=n个)
\d{3,5}
匹配3到5个数字
{m,}
至少m个(x>=m个)
\d{3,}
匹配3个到以上的数字
集合中任意一个
[set]
set可以是单个字符,也可以是范围
[\da-f]
十六进制中单个字符
不在集合中任意一个
[^set]
通上,set前有一个^,表示在所有字符中取set集合的补集
[^3-6]
3到6之外的字符
简单分组
()
括号用于将规则包起来,成为一组,不可拆分的规则不用括号包起来
(\.\d+)
.和紧接着的数字
边界
\b
能组成标识符的字符和不能组成标识符的字符之间
\b\d+
匹配非\w字符紧接着多个数字
或
|
多组规则,任意一组满足
\d{3}|[a-z]{5}
匹配3个数字或5个字母
注意:匹配N个,只连续出现N次。
二、Python中使用正则表达式
常用方法:
方法返回值类型作用
re.match(pattern, string, flags=0) 正则匹配对象、None 从头匹配
re.search(pattern, string, flags=0) 正则匹配对象、None 匹配
re.compile(pattern, flags=0) 正则模式对象、None 编译正则
re.findall(pattern, string, flags=0) 列表 查找所有匹配
re.sub(pattern, repl, string, count=0, flags=0) 字符串 字符串替换
re.split(pattern, string, maxsplit=0, flags=0) 列表 字符串分割
re.finditer(pattern, string, flags=0) 可迭代对象 获取多次匹配
匹配模式(标志):
re.I:Ignore Case,全称 re.IGNORECASE,忽略字母大小写。
补充:
正则匹配对象的方法中,groups()方法,可以得到匹配到的所有组,是元组类型。
re.search()方法,只有匹配到一个以后,就不再继续查找了。
re.compile()编译得到的结果是一个正则模式对象,可以调用查找、匹配等方法,但是不需要再传递模式(pattern)参数。
re.findall()返回的数据与模式有关,如果模式中没有组,会返回所有找到的完整匹配,如果模式中有组,只会返回匹配到的组内容。无论是否匹配到了数据,都会返回一个列表。
re.findall()返回值演示
importre
found1= re.findall(r'\d{2}\D', 'addafd3434daf3434adf')print(found1)#['34d', '34a']
found2= re.findall(r'(\d{2})\D', 'addafd3434daf3434adf')print(found2)#['34', '34']
found3= re.findall(r'((\d){2})\D', 'addafd3434daf3434adf')print(found3)#[('34', '4'), ('34', '4')]
re.finditer()返回一个可迭代对象,可迭代对象每一次迭代返回的的是一个正则匹配对象。不管能不能匹配到数据,都会返回一个可迭代对象。
re.finditer()使用示例:
# 示例一
importre
pattern= r'((\d+)\.(\d{2}))\D'data= 'piis3.1415,rmb have 2.50,one apple need 3.25 yuan'it=re.finditer(pattern, data)for i inre.finditer(pattern, data):print(i, i.groups())
# 示例二
importre
pattern= r'(\d{2})\.(\1)\2'data= '12.34dsafafad22.22,ad23.2323fd33.33,44.45'
for i inre.finditer(pattern, data):print(i, '\t', i.groups())
其他示例代码:
re.sub(r'灌水|水军|扯淡', '***', '一大批水军在这里扯淡、整天灌水。')
re.sub(r'(\d+)[a-z]+', r'(\1)', 'he234He, Hh66aabbcc')importre
data= 'pi is 3.1415, I have a DREAM, Learning Python'repl= '-*-'split_result= repl.join(re.split(r'[a-z]+', data))
sub_result= re.sub(r'[a-z]+', repl, data)print(split_result)print(sub_result)print(split_result == sub_result)