正则表达式中的转义字符

1 投票
3 回答
1184 浏览
提问于 2025-04-16 02:30

下面这个是正则表达式:

 [a-z]+[\\.\\?]

为什么这里的\\要用两次,而不是一次呢?

3 个回答

0

第一个是对句号进行了转义。第二个是对问号进行了转义。

2

在这里,.? 都被进行了转义处理,也就是说它们的特殊含义被取消了。

不过,在正则表达式的字符类(也就是在 [] 里面)就不需要这样做。这样写也是可以的:

[a-z]+[.?]

补充说明: 你提到的关于 \\ 的问题,情况有点复杂。这条正则表达式是在 "" 这样的字符串里面吗?根据不同的编程语言,有时候在双引号里面,\ 需要再转义一次。但如果是在 '' 里面,可能就不需要了。你是从哪里看到这个的呢?

3

下面这个正则表达式:

 [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 也可以理解为“正则表达式模式”的意思:-)。

撰写回答