我正在阅读re
库的python doc,但对以下段落感到困惑:
正则表达式使用反斜杠字符('\')表示特殊形式或允许使用特殊字符而无需调用其特殊含义。这与Python在字符串文字中出于相同目的使用相同字符的目的相冲突;例如,要匹配文字反斜杠,可能必须写“ \\\\”作为模式字符串,因为正则表达式必须为\\,并且每个反斜杠必须在正则Python字符串文字中表示为\\。
\\\\
如何评估?
\\\\
-> \\\
-> \\
级联
或\\\\
-> \\
成对?
我知道\
是一个像|
一样的元字符,我可以做到
>>> re.split('\|', 'a|b|c|d') # split by literal '|'
['a', 'b', 'c', 'd']
但是
>>> re.split('\\', 'a\b\c\d') # split by literal '\'
Traceback (most recent call last):
给我一个错误,看来\|
与\\
的计算不只一次。
我尝试了
>>> re.split('\\\\', 'a\b\c\d')
['a\x08', 'c', 'd']
这让我更加困惑...
答案 0 :(得分:4)
这里发生了两件事-如何评估字符串以及如何评估正则表达式。
'a\b\c\d'
代表字符串a<backspace>\c\d
'\\\\'
代表字符串\\
。\\
是与字符\
匹配的正则表达式模式您的问题是您搜索的字符串不是您期望的字符串。
\b
是退格字符\x08
。 \c
和\d
根本不是真实字符。在python 3.7中,这将是一个错误。
我认为您是要拼写r'a\b\c\d'
或'a\\b\\c\\d'
答案 1 :(得分:2)
re.split('\\', 'a\b\c\d') # split by literal '\'
您忘记了第二个字符中的'\'是转义字符,如果更改了第二个字符,它将起作用:
re.split(r'\\', 'a\\b\\c\\d')
此r
开头表示“原始”字符串-不评估转义字符。
答案 2 :(得分:1)
考虑级联评估反斜杠的含义:
如果您想要字符串\n
(不是换行符,而是\ n),则找不到找到该字符串的字符序列。
\n
将是换行符号,\\n
将被评估为\n
,这又将再次成为换行符号。这就是为什么对转义序列进行成对评估的原因。
因此,您需要在字符串中写入\\
以获得单个\
,但是您必须在字符串中使用反斜杠,以便正则表达式将与文字\
匹配。因此,您将需要写\\\\
来匹配文字反斜杠。
您的a\b\c\d
字符串也有类似的问题。解析器将尝试评估转义序列,并且\b
是'backspace'的有效序列,表示为\x08
。您也需要在这里转义反斜杠,例如a\\b\\c\\d
。