一、 正则表达式
元字符 |
d |
digit,数字(等效:[0-9]) |
d+ |
匹配连续的数字 |
D |
非数字 |
D{3} |
匹配连续的非数字 |
|
w |
word,单词([A-Z0-9a-z_]) |
w{6} |
6个单词字符 |
|
W |
非单词(单词是指标识符) |
W{3} |
3个非单词字符 |
|
s |
space,空白字符([ ]) |
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+) |
.和紧接着的数字 |
边界 |
能组成标识符的字符和不能组成标识符的字符之间 |
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()返回值演示
import re 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()使用示例:
# 示例一
import re 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 in re.finditer(pattern, data): print(i, i.groups())
# 示例二
import re pattern = r'(d{2}).(1)2' data = '12.34dsafafad22.22,ad23.2323fd33.33,44.45' for i in re.finditer(pattern, data): print(i, ' ', i.groups())
其他示例代码:
re.sub(r'灌水|水军|扯淡', '***', '一大批水军在这里扯淡、整天灌水。') re.sub(r'(d+)[a-z]+', r'(1)', 'he234He, Hh66aabbcc') import re 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)