模式介绍
基本用法
- ^: 匹配字符串的开头,如:
^很
- $: 匹配字符串的末尾,如:
蓝$
- .: 匹配除了换行符外的任意字符,指定re.S(re.DOTALL)时,可包括换行符
- []: 匹配[]中任意一个字符,如:
\[Pp\]
,\[0-9\]
- [^...]: 匹配不在[]中的字符,如:
[^abc]
,可匹配除了a,b,c之外的字符 - : 匹配其前面的字符出现0次或多次,如:
hel*
,可匹配 helll,he - +: 匹配其前面的字符出现1次或多次,如:
hel+
,可匹配 helll,hel,但无法匹配he - ?: 匹配其前面的字符出现0次或1次,如:
hel?
, 可匹配hel,he,但无法匹配hell - {n}: 匹配其前面的表达式出现n次,如:
o{2}
,可匹配food,但无法匹配pow - {n,}: 匹配其前面的表达式出现n次以上,如:
o{2,}
,可匹配food,fooooood,无法匹配pow,o{1,}
,等价于o+
,o{0,}
,o*
- {n,m}: 匹配其前面的表达式最少出现n次最多出现m次,如:
o{2,5}
,可匹配food,foooood,无法匹配pow,fooooood,o{0,1}
,等价于o?
- a|b: 匹配a或b,如:
p[a|b]ck
,可匹配pack,pbck
分组
- (): 对正则表达式分组,并返回括号中的内容
- (?imx): 正则表达式包含三种可选标志:i, m, 或 x ,只影响括号内的区域
- (?-imx): 正则表达式关闭 i, m, 或 x 可选标志,只影响括号内的区域
- (?: re): 类似 (), 但不表示一个组
- (?imx: re): 在括号中使用i, m, 或 x 可选标志
- (?-imx: re): 在括号中不使用i, m, 或 x 可选标志
- (?#...): 注释
- (?=re): 前向肯定界定符
re.findall(r'\d+(?=abc)',"1abc")
,只抽取数字,且该数字后面跟的字符是abc - (?!re): 前向否定界定符。
re.findall(r'\d+(?!abc)',"1abf")
,只抽取数字,且该数字后面跟的字符不是abc - (?<!re): 后向否定界定符
- (?>ew): 后向肯定界定符
特殊符号
- \w: 匹配字母数字及下划线,等价于 [A-Za-z0-9_]
- \W: 匹配非字母数字及下划线,等价于 [^A-Za-z0-9_]
- \s: 匹配任意空白字符,等价于 [ \f\n\r\t\v]
- \S: 匹配任意非空字符,等价于 [^ \f\n\r\t\v]
- \d: 匹配任意数字,等价于 [0-9]
- \D: 匹配任意非数字,等价于 [^0-9]
- \A: 匹配字符串开始
- \z: 匹配字符串结束
- \Z: 匹配字符串结束,如果存在换行,只匹配到换行前的结束字符串
- \G: 匹配最后匹配完成的位置
- \b: 匹配单词边界,即单词和空格间的位置 ,如:
er\b
,可匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er' - \B: 匹配非单词边界,如:
er\B
,可匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er' - \n, \t, 等: 匹配换行符,制表符等
- \1...\9: 匹配第n个分组的内容
- [\u4e00-\u9fa5]: 可以匹配任意UTF-8编码下的中文字符
修饰符
- re.I 忽略大小写
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- re.M 多行模式,影响 ^ 和 $
- re.S 匹配包括换行在内的所有字符
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
- re.X 为了增加可读性,忽略空格和 # 后面的注释
匹配对象方法
- group(num=0): 输入可为多个组号,获取包含组所对应值的元组
- groups(): 获取包含所有小组字符串的元组
- group([group1, …]):获取一个或多个分组匹配字符串
- start([group]):获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0
- end([group]):获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0
- span([group]):获取 (start(group), end(group))
函数
从起始位置查找
re.match(pattern, string, flags=0):从字符串的起始位置匹配模式,可以使用group(num) 或 groups() 获取匹配表达式
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,表示匹配模式,具体参数如下:
re.match('www', 'www.baidu.com').span()
#返回:(0,3)
re.match('com', 'www.baidu.com')
#返回:None
查找匹配字符串
re.search(pattern, string, flags=0):扫描整个字符串并返回第一个成功的匹配,可以使用group(num) 或 groups() 获取匹配表达式
re.search('www', 'www.baidu.com').span()
#返回:(0,3)
re.search('com', 'www.baidu.com').span()
#返回:(11,14)
替换字符串
re.sub(pattern, repl, string, count=0, flags=0):替换字符串中的匹配项
repl:替换的字符串,也可为一个函数
count:模式匹配后替换的最大次数,默认0表示替换所有的匹配
re.sub(r'#.*$', "", "2004-959-559 # 这是电话号码")
#返回:2004-959-559
re.sub(r'\D', "", "2004-959-559 # 这是电话号码")
#返回:2004959559
编译正则表达式
re.compile(pattern[, flags]):用于编译正则表达式,生成正则表达式对象,使运行速度更快,可供 match() 和 search() 这两个函数使用
查询子串(返回列表)
re.findall(pattern, string[, pos[, endpos]]):在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果无匹配项,则返回空列表
pos:指定字符串的起始位置,默认为 0
endpos:指定字符串的结束位置,默认为字符串的长度
result1 = re.findall(r'\d+', 'baidu 123 google 456')
#返回:\['123', '456']
result2 = re.findall(r'\d+', 'bai88du123google456', 0, 10)
#返回:\['88', '12']
查询子串(返回迭代器)
re.finditer(pattern, string, flags=0):在字符串中找到正则表达式匹配的所有子串,并把它们作为一个迭代器返回
it = re.finditer(r"\d+","12a32bc43jf3")
for match in it:
print(match.group())
#返回:12,32,43,3
切分字符串
re.split(pattern, string[, maxsplit=0, flags=0]):按照能够匹配的子串将字符串分割后返回列表
maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数
re.split('\W+', 'baidu, baidu, baidu.')
#返回:\['baidu', 'baidu', 'baidu', '']
re.split('(\W+)', ' baidu, baidu, baidu.')
#返回:\['', ' ', 'baidu', ', ', 'baidu', ', ', 'baidu', '.', '']
re.split('\W+', ' baidu, baidu, baidu.', 1)
#返回:\['', 'baidu, baidu, baidu.']
re.split('a*', 'hello world')
#返回:\['hello world']
(参考: 玉冰整理总结)