更新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允许\\
匹配文字反斜杠,会发生什么?这是不存在的基础吗?如果是这样,你能举个例子吗?
提前致谢。很长一段时间它让我很困惑。
答案 0 :(得分:3)
这里有两层:第一,有Python字符串文字语法,然后是正则表达式语法。
\e
在Python字符串文字中没有任何特殊含义,因此两个字符都会逐字传递给正则表达式引擎,在那里它们与e
匹配,因为这样做了\
在该上下文中的含义:它从以下字符中删除任何特殊含义。 (事实上,e
在regexen中没有任何特殊含义,并不会起作用。
答案 1 :(得分:2)
\e
和e
对于正则表达式是相同的。正则表达式中的\
用于指示后面的字符具有特殊含义。您可以找到有效特殊序列here的列表,而\e
不是其中之一。因此,\
前面的e
会被忽略。当您在代码中说\\
时,实际上在正则表达式中说\
。我们知道,\
赋予后面的角色特殊的意义。但是,当我们说\\
时,没有任何字符。这就是它给出错误信息的原因。要实际匹配\
,您需要像\
一样转义\\\\
。或者你可以像这样使用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表示 使用此原始字符串表示法的代码。