Python 3.3.3重新编译(';e';)和重新编译(';\e';)时发生了什么?

Python 3.3.3重新编译(';e';)和重新编译(';\e';)时发生了什么?,python,regex,Python,Regex,更新1: >>> '\e' '\\e' 上面显示Python文字分析器将“\e”视为两个字面值\和e。我说得对吗?如果是,, re.compile('\e')首先也应遵循此规则。i、 例如,它应该匹配两个LIERS\和e。像这样: >>> re.findall('\e','\e\e') ['\e', '\e'] 如果我错了,为什么 原始问题: 为了方便起见,我使用rer来表示python标准lib-re模块的机制 我已经阅读了python文档中的相关文章。

更新1:

>>> '\e'
'\\e'
上面显示Python文字分析器将
“\e”
视为两个字面值
\
e
。我说得对吗?如果是,,
re.compile('\e')
首先也应遵循此规则。i、 例如,它应该匹配两个LIERS
\
e
。像这样:

>>> re.findall('\e','\e\e')
['\e', '\e']
如果我错了,为什么

原始问题:

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

我已经阅读了python文档中的相关文章。我知道警告“强烈建议对所有表达式使用原始字符串,但最简单的表达式除外”。但是我只是想知道如果我不使用原始字符串,那么重新编译将如何工作。看看这个:

>>> 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']
>>> re.findall('\n','\n')
['\n']
如您所见,在执行搜索时,A和B之间没有什么不同。然后:

为什么“\e”可以匹配字符串文字“e”

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

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

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

>>> 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']
>>> re.findall('\n','\n')
['\n']
非常有效。但是,当您将
n
更改为
\
时,rer会引发错误。这对我来说真的很难理解

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


提前谢谢。这让我困惑了很久。

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

\e
在Python字符串文本中没有任何特殊含义,因此这两个字符都会被逐字传递到正则表达式引擎,在正则表达式引擎中它们与
\e
匹配,因为这就是
\
在该上下文中的含义:它会从以下字符中删除任何特殊含义。(事实上,
e
在regexen中没有任何特殊的意义,这一点并不重要)

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

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

    正则表达式使用反斜杠字符(“\”)表示 特殊形式或允许使用特殊字符而无需 调用它们的特殊含义。这与Python对 字符串文字中用于相同目的的相同字符;对于 例如,要匹配文字反斜杠,可能需要写“\\” 作为模式字符串,因为正则表达式必须为\,并且 每个反斜杠必须在常规Python字符串中表示为\ 文字

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


    我知道规则“当你在代码中说\\时,实际上是在正则表达式中说\”。我不知道为什么我们不能说“当你在代码中说\\时,你也在正则表达式中说\\”。@Pythoner的
    \
    实际上是在python代码中转义
    \
    。所以,我们实际上是将
    \
    传递给正则表达式。是的,这正是我所想的。根据这个逻辑,
    re.compile(“\\”)
    应该匹配一个文本反斜杠,因为第一个\删除了下面\的任何特殊含义。