正则表达式
正则语法
特性
正则表达式可以拼接,如果A和B都是正则表达式,那么 AB也是正则表达式.如果字符串p匹配A并且另一个字符串q匹配B, 那么pq可以匹配 AB.这就构成了由简单构建复杂的基础.除非:
A或者B包含低优先级操作
A和B存在边界条件
存在命名组引用。
字符
元字符 : 特殊字符
它们不匹配自己,在正则中具有其它的意义,匹配自己需要转义.
元字符的完整列表:
基础字符
字符
功能
\
转义
[ ]
匹配一类单个字符,在里面的字符除了[- ^ \s \S \d \D \w \W] 都是普通字符
()
分组.与数学中括号的作用大致相同.将括号内的内容视作一个独立字符或部分.
零宽度断言
它们不用来代表字符,用来实现一些特殊的匹配功能
字符
功能
|
“or”运算符,优先级非常低.存在短路 现象
^
[ ]内字符集的取反,或写在模式开头,代表以模式开头.MULTILINE
模式中,可以匹配在换行符之后的字符串内的任何位置。
$
写在模式结尾,代表以模式结尾.只有\n
在结尾也算匹配成功
\A
不在 MULTILINE
模式时,和 ^
相同.MULTILINE
模式中,\A
仍然只在字符串开头匹配
\Z
只匹配字符串尾
\b
匹配完整单词,前后都是非字母数字字符:r'\bclass\b'
.必须使用r''
,因为Python会把\b
解析为退格
\B
不在字边界时才匹配
\number
匹配数字代表的组合
重复限定
它们不能直接嵌套使用,避免了非贪婪后缀 ?
修饰符,和其他实现中的修饰符产生的多义性
可以使用括号包围再进行嵌套
字符
功能
.
匹配一个任意字符一次,是否包括换行符取决于DOTALL 参数
{m,n}
匹配前一个字符的出现次数范围, m <=出现次数 <=n . 可以缺省其中一个,视为0或无上限
{m}
匹配前一个字符的m个重复,少于 m 的话就会导致匹配失败
*
{0,} 它的匹配是 贪婪的 ,先尽可能多地匹配,不成功再回退.
+
{1,}
?
{0,1} , 代表一个可选字符.还可做非贪婪后缀修饰符
一类单个字符
语法
含义
同义替换
[abc]
a 或 b 或 c
a|b|c
[a-z]
a-z 所有字符
[^5]
除了5所有的字符
\d
数字
[0-9]
\D
非数字
[^0-9]
\s
空白符
[\t\n\r\f\v]
\S
非空白符
[^ \t\n\r\f\v]
\w
大小写字母与数字
[a-zA-Z0-9_ ]
\W
非字母与数字
[^a-zA-Z0-9_ ]
Python 中的正则 – re 模块
参考链接
Python re模块 官方文档
Python 正则入门 官方教程
特性
模式和被搜索的字符串既可以是 Unicode 字符串str ,也可以是8位字节串bytes .但不能混用.
反斜杠灾难: python字符串中和正则中 / 都是转义字符,所以需要二次转义.正则中一个 ‘/’ 在字符串中就会写成 ‘’ .解决方法是尽量使用 Python 的原始字符串表示法,在字符串前加 r ,例如: r’/'
第三方模块regex , 提供了与标准库re 模块兼容的API接口, 同时还提供了额外的功能和更全面的Unicode支持 。
正则表达式模式被编译成一系列字节码,然后由用 C 编写的匹配引擎执行.
适当选择代码和正则: 虽然 Python 代码比精心设计的正则表达式慢,但它也可能更容易理解.
是Python附带的C扩展模块
API
编译正则
import re
p = re. compile ( 'ab*' )
// 还可以接受一个可选的flag参数, 用于启用各种特殊功能和语法变体
re. compile ( 'ab*' , re. IGNORECASE)
编译标志(选项)
标志(前加 re.)
缩写
含义
ASCII
A
使几个转义如 \w
、\b
、\s
和 \d
仅与具有相应的 ASCII 字符匹配而不是完整匹配Unicode
DOTALL
S
使 .
匹配任何字符,包括换行符,否则不包括换行符
IGNORECASE
I
忽略大小写
LOCALE
L
进行区域设置感知匹配,应用于考虑到语言差异的程序
MULTILINE
M
多行匹配,将每行(以换行符为分割)视作单独的字符串.
VERBOSE
X
忽略正则中不在字符类里的空格将被忽略.使用户可以使用**空格,缩进,注释(#)**美化正则的格式
DEBUG
无
显示编译时的debug信息
pat = re. compile ( r"""
\s* # Skip leading whitespace
(?P<header>[^:]+) # Header name
\s* : # Whitespace, and a colon
(?P<value>.*?) # The header's value -- *? used to
# lose the following trailing whitespace
\s*$ # Trailing whitespace to end-of-line
""" , re. VERBOSE)
匹配方法
正则对象的方法和属性
方法/属性 - 正则编译后的对象.方法名()
功能
match('字符串'[,起始位置[,结束位置]])
从字符串开头开始匹配,返回匹配对象
search('字符串'[,起始位置[,结束位置]])
找到第一个匹配成功的子字符串,返回匹配对象
findall('字符串'[,起始位置[,结束位置]])
找到并用列表 返回所有匹配的子字符串
finditer('字符串'[,起始位置[,结束位置]])
找到并返回所有匹配成功的匹配对象的iterator
fullmatch('字符串'[,起始位置[,结束位置]])
对被查找串的完整匹配,相当于加了[^…$],返回匹配对象
split('字符串',最大分割数=0)
在正则匹配的所有地方将其拆分为列表.默认分割所有.就地
sub('表达式','字符串',替换次数=0)
替换匹配到的位置,默认替换所有.就地
subn('表达式','字符串',替换次数=0)
与 sub()
相同,但返回新字符串和替换次数.就地
flags
标记 参数 选项
groups
捕获组合的数量
groupindex
命名捕获组的字典,如果没有命名捕获组则字典为空
pattern
编译对象的原始样式字符串
模块的顶级方法
顶级函数允许同时传入正则表达式和要匹配的字符串,返回值和re.compile 下方法的返回值相同
但是如果需要多次匹配,且正则表达式相同,则会进行很多次不必要的编译
每个函数还能在后面传入一个可选的标志参数,只能有一个标志
方法/属性 - re.方法名()
功能
match('表达式','字符串',标志)
从字符串开头开始匹配,返回匹配对象
search('表达式','字符串',标志)