一、 引言
在前面《第11.13节 Python正则表达式的转义符”\”功能介绍》介绍了正则表达式转义符
'\'
,只不过当时作为转义符主要是用于在正则表达式中表示元字符自身的需要进行的转义。实际上,除了元字符使用转义符外,Python还支持由
'\'
和一个ASCII数字或ASCII字母字符组成的特殊序列,这些特殊代表特殊的含义。 如果
'\'
后面跟的字符不是ASCII数字或者ASCII字母,那么正则样式将直接匹配后面跟的字符,如
’\$’
匹配字符 ‘$’。
二、 特殊序列
-
\number
number表示一个ASCII数字,\number表示数字代表的组。正则表达式中每个括号是一个组,组从1开始编号。关于组和组号的介绍及案例请大家参考后续章节《第11.16节 Python正则元字符“()”(小括号)与组(group)匹配模式》、《第11.17节 Python 组匹配模式扩展的命名组功能及组的反向引用》。
注意如果 number 的第一个数字是0, 或者 number 是三个八进制数,它将不会被看作是一个组的序号,而是一个八进制的数字。在 ‘[’ 和 ‘]’ 字符集合内,任何数字转义都被看作是数字字符。 -
\A
只匹配字符串开始, 该功能与match函数的功能基本相同,与脱字符“^”在多行模式(搜索标记中包含re.MULTILINE,关于搜索标记的含义请见《第11.2节 Python re模块函数概览》)处理不同,其他方面基本相同。
例子:
>>> m=re.search(r'\A([A-Z][a-z]*) ([A-Z].*)','Learning Python with LaoYuan!')
>>> m.groups()
('Learning', 'Python with LaoYuan!')
>>>
-
\b 匹配一个单词的边界
\b 匹配一个单词的边界用于匹配一个单词的边界,本身匹配结果为空字符串,但用于分隔一个单词的左边界或右边界,当用于左边界时,表示匹配时其后面的字符是一个单词的开始,其前面不能有单词字符,当用于右边界时,表示正则表达式前面的单词至此结束,匹配时后面不能再有单词字符。
例如:
>>> re.search(r'\bPython','LaoYuanPython accompanies you learning Python')
>>> re.search(r'Python\b','LaoYuanPython accompanies you learning Python')
>>>
由于“LaoYuanPython”中的“‘Python’”不是一个独立单词,前面还有单词字符,因此当要匹配左边界时不符合匹配条件,因此第一个语句匹配的是后面的“Python”,而第二个语句是右边界的匹配,此时“LaoYuanPython”后面没有单词字符,因此可以匹配。
\b本身匹配的是一个空字符串,即它解析时不占用字符串的字符。如:
>>> re.search(r'Python\b a','LaoYuanPython accompanies you learning Python')
从上面例子可以看到\b并不影响后面的空格和字母a的匹配,即它没有消耗搜索字符,本身匹配的是空字符串。
-
\B 匹配一个单词的非边界
\B 匹配一个单词的非边界,即\B所在位置必须有一个单词字符,不能在词的开头或者结尾,其匹配结果本身为空字符串,不消耗搜索字符。如下面的例子,匹配的是后一个Python:
>>> re.search(r'\BPython','Learning Python with LaoYuanPython')
-
\d匹配数字
对于 字符串,匹配任何Unicode十进制数(就是在Unicode字符目录[Nd]里的字符)。这包括了 [0-9] ,和很多其他的数字字符。如果设置了 ASCII 标志,就只匹配 [0-9] 。
对于字节码bytes类型:匹配任何十进制数,就是 [0-9]。
案例:
re.search(r'(\d*)','123123一二三壹贰叁①②③123')
-
\D匹配非数字
匹配任何非十进制数字的字符。就是 \d 取非。 如果设置了 ASCII 标志,就相当于 [^0-9] 。 -
\s匹配空白字符
对于字符串str类型:匹配任何Unicode空白字符(包括 [ \t\n\r\f\v] ,还有很多其他字符,比如不同语言排版规则约定的不换行空格)。如果 ASCII 搜索标记被设置,就只匹配字符集 [ \t\n\r\f\v] 。
对于字节码bytes类型:匹配ASCII中的空白字符,就是匹配字符集 [\t\n\r\f\v] 。 -
\S 匹配非空白字符
匹配任何非空白字符。就是 \s 取非。如果设置了 ASCII 标志,就相当于 [^ \t\n\r\f\v] 。 -
\w 匹配词语字符
对于 Unicode (str) 样式:
匹配Unicode词语的字符,包含了可以构成词语的绝大部分字符,也包括数字和下划线。如果设置了 ASCII 标志,就只匹配 [a-zA-Z0-9_] 。
对于8位(bytes)样式:
匹配ASCII字符中的数字和字母和下划线,就是 [a-zA-Z0-9_] 。如果设置了 LOCALE 标记,就匹配当前语言区域的数字和字母和下划线。 -
\W
匹配任何非词语字符。是 \w 取非。如果设置了 ASCII 标记,就相当于 字符集[^a-zA-Z0-9_] 。如果设置了 LOCALE 标志,就匹配当前语言区域的 非 词语字符。 -
\Z匹配字符串尾
匹配字符串尾,就表示匹配串必须位于字符串结尾,该功能与元字符 类 似 , 但 在 多 行 模 式 下 , Z 不 能 支 持 识 别 非 最 后 一 行 的 行 尾 , 而 类似,但在多行模式下,\Z不能支持识别非最后一行的行尾,而 类 似 , 但 在 多 行 模 式 下 , Z 不 能 支 持 识 别 非 最 后 一 行 的 行 尾 , 而 可以。如:
>>> re.search(r'(\d*)\Z','123123一二三壹贰叁①②③123')
三、 Python的其他转义符支持
正则表达式支持绝大部分Python的标准转义字符,包括:\a、\b、\f、\n、\r、\t、\u、\U、\v、\x、\,其中\b 被用于表示词语的边界,在字符集合内表示退格。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!