什么是正则表达式
正则表达式(Regular Expression), 是一个模版字符串, 可以根据这个模版字符串, 对其它字符串进行匹配, 查找, 替换等操作
元字符(metacharacter)
正则表达式由一个或多个元字符组成
常见的元字符:
元字符 | 描述 |
---|---|
[ ] | 字符类(character class),匹配其中的任意一个字符 |
[a-z] | 字符a到z的任意一个 |
[^a] | 不是字符a,^需放在首位 |
* | 重复前一字符0+次,贪婪匹配(匹配尽可能多的字符) |
*? | 重复前一字符0+次,非贪婪匹配(匹配尽可能少的字符) |
+ | 重复前一字符1+次,贪婪匹配 |
+? | 重复前一字符1+次,非贪婪匹配 |
? | 重复前一字符0或1次 |
{m,n} | 重复前一字符至少m次,至多n次,m默认0,n默认20亿,贪婪匹配 |
{m,n}? | 重复前一字符至少m次,至多n次,m默认0,n默认20亿,非贪婪匹配 |
. | 任意字符,除了\n |
| | 或,匹配两侧的若干字符,优先级很低 |
hello | world | 匹配hello或者world,而不是在o和w之间取舍 |
^ | 必须出现在正则表达式的开始处,表示匹配目标字符串的左侧(每行的开始处) |
$ | 必须出现在正则表达式的结尾处,表示匹配目标字符串的右侧(每行的结尾处) |
() | 组,每一对括号即一个组,没有括号时只有一个默认组(group 0),其它组从group 1 开始 |
(?P<name>…) | 命名组,可用过name索引group |
(?=…) | 正向前看断言,存在…则继续其它匹配,但不捕获…,否则匹配失败,不占宽度 |
(?!..) | 逆向前看断言,不存在…则继续匹配,不占宽度 |
(?:…) | 不捕获组,匹配但不捕获匹配的子串,占宽度 |
\g<n> | 向后引用group n |
\g<name> | 向后引用group name |
\n (?P=name) \g<name> \g<n> | 向后引用,引用指定组的值 |
\A | 只在整个目标字符串的开始处匹配 |
\Z | 只在整个目标字符串的结尾处匹配 |
\ | 转义字符 常用raw字符串来阻止转义,否则需要\来表达转义字符(python字符串规则) |
\w | [a-zA-Z0-9] 所有数字字母 |
\W | [^a-zA-Z0-9] 所有非数字字母 |
\d | [0-9] 所有数字 |
\D | [^0-9] 所有非数字 |
\s | [ \t\n\r\f\v], 所有空白字符 |
\S | [^ \t\n\r\f\v], 非空白字符 |
\b | 单词边界,即空白或其它非单词字符,不占宽度 |
\B | 非单词边界,不占宽度 |
编译标志
在使用正则表达式时, 可以指定编译标志来控制正则表达式的工作方式
标志 | 描述 |
---|---|
re.A, re.ASCII | 使\w\b\s\d仅匹配ASCII字符 |
re.S, re.DOTALL | 使.匹配所有字符,包括\n |
re.I, re.IGNORECASE | 忽略大小写 |
re.M, re.MULTILINE | 多行匹配 |
re.X, re.VERBOSE | 忽略空白,可以使用#添加注释 |
re.U | 根据Unicode字符集解析字符, 影响\w, \W, \b, \B |
python中的使用方式
一次性使用
# 当一个正则表达式只用一次时, 可以使用这种方式
import re
s = 'Hello world'
# 直接调用re模块中的函数
# 第一个参数是正则表达式
# 第二个参数是要匹配的字符串
# 第三个参数是编译标志, 可选
res = re.match(r'\w+', s, re.I)
预编译方式
# 当需要多次使用同一个正则表达式时, 可以使用预编译方式
import re
s1 = 'hello world'
s2 = 'This is a string.'
# 编译正则表达式, 得到一个模式对象
pattern = re.compile(r'\w+', flags=re.I)
# 调用模式对象的方法匹配指定字符串, 可以重复使用
res1 = pattern.match(s1)
res2 = pattern.match(s2)
具体功能
匹配
import re
# 编译正则表达式, 得到模式对象
p = re.compile(patternString,flags=0)
# 使用模式对象匹配指定字符串,返回match对象或None,从字符串最左端进行匹配
# string是要匹配的字符串, pos是开始位置, endpos是结束位置
m = p.match(string[,pos[,endpos]])
# match对象的方法
# 获取分组值
m.group(n) # 返回分组n的值
m.group(name) # 返回名称为name的命名分组的值
m.group(x, y, z) # 返回x, y, z分组的值的元组
m.groups() # 返回除了group 0之外的所有分组值的元组
# 获取匹配的范围
m.span() # 以元组的形式返回匹配的结果在原字符串中的索引位置, (m, n)
m.start() # 匹配结果在原字符串中开始的位置
m.end() # 匹配结果在原字符串中结束的位置
搜索
import re
# 编译正则表达式, 得到模式对象
p = re.compile(patternString,flags=0)
# 使用模式对象匹配指定字符串,返回匹配对象或None,从字符串的任意位置开始匹配,返回第一个匹配的匹配对象(match)
# string是要搜索的字符串, pos是开始位置, endpos是结束位置
m = p.search(string[,pos[,endpos]])
查找全部
import re
p = re.compile(patternString,flags=0)
# 返回所有匹配值的列表
p.findall(string[,pos[,endpos]])
# 返回包含所有匹配值的迭代器
p.finditer(string[,pos[,endpos]])
替换
import re
p = re.compile(patternString,flags=0)
# 替换所有匹配值,返回替换后的新字符串
# replacement可以是字符串,也可以是函数
# 当replacement是函数时,每次匹配时将match对象传入函数,函数应返回字符串结果,用来替换匹配值
# count参数用来指定替换次数
p.sub(replacement,string[,count=0]) # 返回替换后的新字符串
p.subn(replacement,string[,count=0]) # 返回新字符串和替换次数的元组
切割
import re
p = re.compile(patternString,flags=0)
# 按照匹配切割字符串,如果表达式包含组,则匹配的组会被列在结果列表中
p.split(string[,maxsplit]) # 返回列表