2013-11-28 20 views
2

更新1:Python 3.3.3 re.compile('e')和re.compile(' e')发生了什么?

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

以上情况说明,Python的文本分析器对待'\e'两个文字\e。我对吗?如果是这样, re.compile('\e')也应遵循此规则第一。即它应该匹配两个文字\e。像这样:

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

如果我错了,为什么?

原题:

为了方便我用RER指示蟒蛇标准库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允许\\匹配一个反斜杠?它是不是像重新存在的基础?如果是这样,你能举个例子吗?

在此先感谢。它让我困惑很久。

回答

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

    re.compile(r'\\') 
    print(re.findall(C, "\\")) 
    

http://docs.python.org/3/library/re.html

正则表达式引用使用反斜杠字符(“\”)来表示 特殊形式或允许特殊字符使用没有 援引他们的特殊含义。这与Python的 在字符串文字中用于相同目的的用法相冲突;对于 的示例,要匹配文字反斜杠,可能必须将'\\' 作为模式字符串,因为正则表达式必须是\,并且 每个反斜杠必须在常规Python字符串 之内表示为\。

解决方案是使用Python的原始字符串表示法来定期使用 表达式模式;在 中,不以任何特殊方式处理反斜杠,字符串文字前缀为'r'。因此r“\ n”是包含'\'和'n'的双字符字符串 ,而“\ n”是包含换行符的单字符字符串 。通常模式将使用这种原始字符串表示法以Python 代码表示。

+0

我知道规则'当你在你的代码中说'\'时,你实际上在正则表达式中说'\'。我不知道为什么我们不能说'当你在代码中说'\'时,你也会在正则表达式中说\'。 – tcpiper

+0

@Pythoner'\\'实际上是在python代码中转义'\'。所以,我们实际上是将'\'传递给正则表达式。 – thefourtheye

3

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

\e没有在Python字符串中的任何特殊含义的文字,所以两个角色获得逐字传递给正则表达式引擎,在那里他们匹配e,因为这是\意味着在这方面:它会从任何特殊含义以下字符。 (e在正则表达式中没有任何特殊含义的事实并不是马特)。

+0

是的,这正是我的想法。根据这个逻辑,'re.compile('\\')'应该匹配一个文字反斜杠,因为第一个\从以下\中删除了任何特殊的含义。 – tcpiper

相关问题