python正则表达式详解
元字符
. 匹配任意一个字符(不包括换行符)
[a-z] 字符集合,一个字符的集合,可匹配其中任意一个字符
[^a-z] 字符集合,匹配除集合内的任意一个字符
^ 匹配开始位置,多行模式下匹配每一行的开始
\b 匹配单词开始或结束位置的字符
\B 匹配不位于单词开始或结束位置的字符
\d 匹配一个数字, 相当于 [0-9]
\D 匹配非数字,相当于 [^0-9]
\s 匹配一个空白字符,包括换行符、制表符、空格。相当于 [ \f\r\n\t\v]
\S 匹配非空白字符
\w 匹配[a-zA-Z0-9_],包括中文
\W 匹配\w之外的字符
$ 匹配结束位置,多行模式下匹配每一行的结束
* 表示前面的正则表达式重复0次或多次
+ 表示前面的正则表达式重复至少1次
? 表示前面的正则表达式重复0次或1次
{n} 重复n次
{n,} 重复至少n次
{n,m} 重复n到m次
\ 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\\.只能匹配.,不能再匹配任意字符
x|y 匹配x或者y
(pattern) 分组,捕获后会自动分配组号从1开始,key改变优先级
\数字 匹配对应的分组
(?:pattern)如果仅仅为了改变优先级,就不需要捕获分组
(?<name>exp)分组捕获,但是可以通过name访问分组。python语法必须是(?P<name>exp)
(?=exp) 断言exp一定在匹配的右边出现,表示断言后面一定有exp
(?<=exp) 断言exp一定在匹配的左边出现,表示断言前面一定有exp前缀
(?<=...) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则
(?!exp) 断言exp一定不会出现在右侧,也就是说断言后面一定不是exp
(?<!exp) 断言exp一定不会出现在左侧
[a-z] 字符集合,一个字符的集合,可匹配其中任意一个字符
[^a-z] 字符集合,匹配除集合内的任意一个字符
^ 匹配开始位置,多行模式下匹配每一行的开始
\b 匹配单词开始或结束位置的字符
\B 匹配不位于单词开始或结束位置的字符
\d 匹配一个数字, 相当于 [0-9]
\D 匹配非数字,相当于 [^0-9]
\s 匹配一个空白字符,包括换行符、制表符、空格。相当于 [ \f\r\n\t\v]
\S 匹配非空白字符
\w 匹配[a-zA-Z0-9_],包括中文
\W 匹配\w之外的字符
$ 匹配结束位置,多行模式下匹配每一行的结束
* 表示前面的正则表达式重复0次或多次
+ 表示前面的正则表达式重复至少1次
? 表示前面的正则表达式重复0次或1次
{n} 重复n次
{n,} 重复至少n次
{n,m} 重复n到m次
\ 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\\.只能匹配.,不能再匹配任意字符
x|y 匹配x或者y
(pattern) 分组,捕获后会自动分配组号从1开始,key改变优先级
\数字 匹配对应的分组
(?:pattern)如果仅仅为了改变优先级,就不需要捕获分组
(?<name>exp)分组捕获,但是可以通过name访问分组。python语法必须是(?P<name>exp)
(?=exp) 断言exp一定在匹配的右边出现,表示断言后面一定有exp
(?<=exp) 断言exp一定在匹配的左边出现,表示断言前面一定有exp前缀
(?<=...) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则
(?!exp) 断言exp一定不会出现在右侧,也就是说断言后面一定不是exp
(?<!exp) 断言exp一定不会出现在左侧
*? 匹配任意次,但尽可能少重复
+? 匹配至少1次
?? 匹配0次或1次
{n,}? 匹配至少n次
{n,m}? 匹配至少n次,至多m次
+? 匹配至少1次
?? 匹配0次或1次
{n,}? 匹配至少n次
{n,m}? 匹配至少n次,至多m次
python的正则表达式
常量 (使用 |位或 开启多种选项)
re.M 多行模式
re.S 单行模式
re.I 忽略大小写
re.X 忽略表达式中的空白字符
方法
编译
re.compile(pattern, flags=0)
设定flags,编译模式,返回正则表达式对象regex
pattern就是正则表达式字符串,flags是选项。
单次匹配
re.match(pattern, string, flags=0)
regex.match(string[, pos[, endpos]])
match匹配从字符串开头匹配,regex对象match方法可以重设置开始位置和结束位置。返回match对象
re.search(pattern, string, flags=0)
regex.search(string[, pos[, endpos]])
从头搜索直到第一个匹配,regex对象search方法可以重设置开始位置和结束位置。返回match对象
re.fullmatch(pattern, string, flags=0)
regex.fullmatch(string[, pos[, endpos]])
整个字符串和正则表达式匹配
全文搜索
re.findall(pattern, string, flags=0)
regex.findall(string[, pos[, endpos]])
对整个字符串,从左到右匹配,返回所有匹配项的列表
re.finditer(pattern, string, flags=0)
regex.finditer(string[, pos[, endpos]])
对整个字符串,从左到右,返回所有匹配项,返回迭代器
匹配替换
re.sub(pattern, replacement, string, count=0, flags=0)
regex.sub(replacement, string, count=0)
使用pattern对字符串进行匹配,对匹配项使用replacement替换。
replacement可以是str,bytes,function
re.sub(pattern, replacement, string, count=0, flags=0)
regex.sub(replacement, string, count=0)
同sub返回一个元组(new_string, number_of_subs_made)
分割字符串(不能指定多个字符进行分割)
re.split(pattern, string, maxsplit=0, flags=0)
分割字符串
分组
使用小括号的pattern捕获的数据陪放到组group中
match, search函数可以返回match对象;findall返回字符串列表;finditer返回一个个match对象
如果pattern中使用分组,如果有匹配的结果,会在match对象中
1.使用group(N)方式返回对象分组,1到N是对应的分组,0返回整个匹配的字符串
2.如果使用了命名分组,可以使用group('name')的方式分组
3.也可以使用groups()返回所有组
4.使用groupdict()返回所有命名的分组