python regex'\\\\'如何评估?

时间:2018-07-26 14:26:30

标签: regex python-3.x

我正在阅读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']

这让我更加困惑...

3 个答案:

答案 0 :(得分:4)

这里发生了两件事-如何评估字符串以及如何评估正则表达式。

    python <3.7代码中的
  • 'a\b\c\d'代表字符串a<backspace>\c\d
  • python代码中的
  • '\\\\'代表字符串\\
  • 字符串\\是与字符\匹配的正则表达式模式

您的问题是您搜索的字符串不是您期望的字符串。

\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