正则表达式中的转义字符
下面这个是正则表达式:
[a-z]+[\\.\\?]
为什么这里的\\
要用两次,而不是一次呢?
3 个回答
第一个是对句号进行了转义。第二个是对问号进行了转义。
在这里,.
和 ?
都被进行了转义处理,也就是说它们的特殊含义被取消了。
不过,在正则表达式的字符类(也就是在 []
里面)就不需要这样做。这样写也是可以的:
[a-z]+[.?]
补充说明: 你提到的关于 \\
的问题,情况有点复杂。这条正则表达式是在 ""
这样的字符串里面吗?根据不同的编程语言,有时候在双引号里面,\
需要再转义一次。但如果是在 ''
里面,可能就不需要了。你是从哪里看到这个的呢?
下面这个正则表达式:
[a-z]+[\\.\\?]
...其实不是一个正则表达式,而是一个字符串(这个字符串可以作为正则表达式的模式;你可以通过把它传给 re.compile
来构建一个正则表达式)。
为什么
\\
这个斜杠要用两次,而不是一次呢?
你可能对这个有些误解...:
>>> s = '[a-z]+[\\.\\?]'
>>> s
'[a-z]+[\\.\\?]'
>>> print(s)
[a-z]+[\.\?]
你在每种情况下都要输入 \
两次,这样第一个斜杠就可以“转义”第二个斜杠,也就是说,它可以阻止第二个斜杠和后面的字符一起形成一个“转义序列”。当你查看字符串的 repr
(这是在交互式Python环境中,当你输入字符串对象的名字时显示的内容)时,你会看到它出现了两次。但当你用 print
查看这个字符串时,你只会看到一次——字符串本身没有重复,你可能只是被“输入两次”和“显示两次”(在 repr
中)的特性搞混了。
还有一种更方便的方式来输入完全相同的字符串值,作为字面量:
>>> z = r'[a-z]+[\.\?]'
>>> z
'[a-z]+[\\.\\?]'
>>> print(z)
[a-z]+[\.\?]
>>> z == s
True
前面的 r
前缀(代表“原始字面量”)意味着后面的斜杠都不会被当作转义序列的一部分——每个斜杠都代表它自己,所以不需要重复输入。
注意,z
的行为和 s
完全一样,实际上它们是相等的:前面的 r
并不会让“字符串变成不同的类型”,只是提供了一种方便的方式来输入包含很多斜杠的字符串,而不需要重复输入(这主要是为了方便输入作为正则表达式模式的字面量字符串;r
也可以理解为“正则表达式模式”的意思:-)。