特殊字符:
:匹配字符串的开始
:匹配字符串的结束
:匹配除却
之外的一切字符
:转义字符
:A 或者 B,非贪心匹配,顺序从左往右
:一次或者多次,贪心匹配
:任意次数,贪心匹配
:零次或者一次,贪心匹配。如果出现在
,
,
之后表示非贪心匹配
:m 次
:m 到 n 次,贪心匹配
:非贪心匹配
特殊字符:
:包括大小写英文字母,数字和下划线
:除却
之外的所有字符
:0-9 数字
:除却
之外的所有字符
:空白字符:包括空格,
,
,
:非空白字符
:匹配单词边界,也就是说,是
和
之间。注意它是不对应字符的
:匹配非单词边界,也就是说,是
和
之间或者
和
之间。注意它是不对应字符的
:字符串的开始
:字符串的结束
:换行
:制表符
:回车
:一切标点符号都能构成特殊字符,表示它原本的意思。也就是说
和
在正则表达式中都代表
;但是
和
在正则表达式中前者代表问号,后者代表一个或者多个。
其余还有
,
和
。
集合:
中的内容表示集合,注意并不是代表方括号。集合只匹配一个字符,集合中的元素是并列的,比如
匹配
或者
或者
;
区间用
表示,比如
会匹配所有小写字母。如果要表示字面意义上的
,要么它前面加上
,要么它位于第一个或者最后一个:
或者
或者
;
除却
之外的特殊字符(除例外
,
,
)失去它们原有的意义,只表示本来的字面字符;
转义字符依然有效;
如果位于第一个位置表示除却后面字符的所有字符,如果不在第一个位置就是字面含义;
在集合中如果要表示字面意义上的
需要使用
,或者将其置于第一个位置。
组:
:中的内容表示一个组。如果要匹配字面意义上的圆括号,使用
和
或者
和
,在之后可以用
表示第一个组,第二个组的内容。
:并不匹配字符,表示
,比如
表示忽略大小写匹配。
:表示一个名字叫做
的组,它后续可以以这样的方式被使用:在同一个模式字符串中:
或者
通过匹配对象
:
或者
在
函数的换成的字符串中:
,
,
:向右看匹配,但是本身不匹配任何字符,比如
会匹配所有后面跟子
的
。
:否定的向右看匹配,但是本身不匹配任何字符,比如
会匹配所有后面不跟着
的
。
:向左看匹配,但是本身不匹配任何字符。
:否定的向左看匹配,但是本身不匹配任何字符。
:如果
或者
代表的组存在那么就表示
,否则就表示
。
字符串:
字符串有两种,一种是
普通字符串和
原始字符串,它们的区别在于转意义符号的处理上。
1. 普通字符串:
首先需要说明的是
是非法的,为了表示一个反斜杠,需要使用
来转义,转义的组合有:
\a \b \f \n
\N \r \t \u
\U \v \x \\
\0 \1 \1 \2
\3 \4 \5 \6
\7
而其余的所有情况都被自动的理解为反斜杠加上字符,比如
被理解为
,长度为两个字符,并
字符转义。
所以为了表示特殊字符中的数字
,我们可以使用
或者
,这两者是一模一样的。
In : "\d" == "\\d"
Out: True
比较难以理解的是数字表示的组的处理,为了表示第一组,我们需要使用
,这里需要两个反斜杠,因为一个反斜杠是转义字符。但是为了表示第八组,我们就既可以使用
也可以使用
,这一点是比较奇怪的。如果在表示特殊字符时,你不清楚是否被反斜杠转义了,最安全的使用特殊字符的方式是使用两个反斜杠。
注意到反斜杠在正则表达式中有两个特殊作用:是否表示转义 - 如果不是就代表字面的反斜杠
是否表示特殊字符
因此为了匹配
这个字符串我们需要使用
来表示,比如:
In : re.fullmatch("\\\\", "\\")
Out:
很容易引起困惑的是在第一次和第二次解析中都有意义的情况,比如
,在正则表达式中
和
都表示换行,但是它们实实在在是两个不同的字符串:
In : "\n" == "\\n"
Out: False
In : re.fullmatch("\\n", "\n")
Out:
In : re.fullmatch("\n", "\\n")
Out: No output
2. 原始字符串
可以看到普通字符串转义符号需要两次解析,这对会给书写带来很大的麻烦,这就是引入原始字符串的初衷。原始字符串中的一个反斜杠代表字面意义上的反斜杠,没有转义的意思。也就是说,原始字符串等于把其中的一个转义字符替换成两个转义字符的普通字符。比如下面的结果都为
。
r"\1" == "\\1"
r"\n" == "\\n"
r"\\" == "\\\\"
所以
,
,
都是相同的,
,
,
都是相同的,但是
,
,
中后两个相同和第一个不同。
唯一的例外在于反斜杠跟着单引号或者双引号时反斜杠会转义后面的引号,但是反斜杠依然保留,比如
表示
两个字符,也就是说:
r"\"" == r'\"' == "\\\"" == '\\\"' == '\\"'
同时需要注意的是原始字符串的每个反斜杠后面必须跟着一个字符,比如下面的写法都是非法的:
r"\"
r"\\\"
r"\\1\"
因此不存在一个原始字符串等于普通字符串
。
当做正则表达式匹配时,推荐使用原始字符串!