Python 3.3.3 re.compile('e')和re.compile('\ e')时发生了什么?

时间:2013-11-28 03:06:43

标签: python regex

更新1:

>>> '\e'
'\\e'

上面显示Python文字解析器将'\e'视为两个文字\e。我对吗?如果是这样, re.compile('\e')也应遵循此规则优先。即,它应匹配两个谎言\e。像这样:

>>> re.findall('\e','\e\e')
['\e', '\e']

如果我错了,为什么?

原始问题:

为方便起见,我使用 rer 来指示python标准lib re模块的机制。

我已经阅读了python doc中的相关文章。我知道警告“强烈建议您使用原始字符串除了最简单的表达式”。但我只是想知道如果我不使用原始字符串,re.compile将如何工作。看看这个:

>>> A=re.compile('\e')
>>> B=re.compile('e')
>>> A==B
False
>>> re.findall(A,'eee')
['e', 'e', 'e']
>>> re.findall(B,'eee')
['e', 'e', 'e']

如您所见,执行搜索时A和B之间没有任何区别。然后:

为什么'\ e'可以匹配字符串文字'e'?

你能找到一个会产生差异的字符串文字吗?

另一个问题是为什么re.compile('\\')会引发错误。注意,这是关于re机制的问题,而不是如何编写re源代码。因为我认为:

显然\\意味着字面反斜杠,为什么rer不知道这个?为什么我们需要一个模式\\\\来匹配文字反斜杠?看看这个:

>>> re.findall('\n','\n')
['\n']

完美的作品。但是,当您将n更改为\时,rer会引发错误。这对我来说真的很难理解。

如果rer允许\\匹配文字反斜杠,会发生什么?这是不存在的基础吗?如果是这样,你能举个例子吗?

提前致谢。很长一段时间它让我很困惑。

2 个答案:

答案 0 :(得分:3)

这里有两层:第一,有Python字符串文字语法,然后是正则表达式语法。

\e在Python字符串文字中没有任何特殊含义,因此两个字符都会逐字传递给正则表达式引擎,在那里它们与e匹配,因为这样做了\在该上下文中的含义:它从以下字符中删除任何特殊含义。 (事实上​​,e在regexen中没有任何特殊含义,并不会起作用。

答案 1 :(得分:2)

  1. \ee对于正则表达式是相同的。正则表达式中的\用于指示后面的字符具有特殊含义。您可以找到有效特殊序列here的列表,而\e不是其中之一。因此,\前面的e会被忽略。
  2. 当您在代码中说\\时,实际上在正则表达式中说\。我们知道,\赋予后面的角色特殊的意义。但是,当我们说\\时,没有任何字符。这就是它给出错误信息的原因。要实际匹配\,您需要像\一样转义\\\\。或者你可以像这样使用raw string notation

    re.compile(r'\\')
    print(re.findall(C, "\\"))
    
  3. 引自http://docs.python.org/3/library/re.html

      

    正则表达式使用反斜杠字符(' \')来表示   特殊形式或允许使用特殊字符   唤起他们的特殊意义。这与Python的使用相冲突   字符串文字中用于相同目的的相同字符;对于   例如,为了匹配文字反斜杠,可能需要编写' \\'   作为模式字符串,因为正则表达式必须是\,和   每个反斜杠必须表示为常规Python字符串中的\   文字。

         

    解决方案是使用Python的常规字符串表示法   表达模式;反斜杠不以任何特殊方式处理   带有' r'前缀的字符串文字。所以r" \ n"是一个两个字符的字符串   包含' \'和' n',而" \ n"是一个单字符串   包含换行符。通常模式将用Python表示   使用此原始字符串表示法的代码。