Python 3.3.3重新编译(';e';)和重新编译(';\e';)时发生了什么?
更新1: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文档中的相关文章。
>>> '\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, "\\"))
我知道规则“当你在代码中说\\时,实际上是在正则表达式中说\”。我不知道为什么我们不能说“当你在代码中说\\时,你也在正则表达式中说\\”。@Pythoner的
\
实际上是在python代码中转义\
。所以,我们实际上是将\
传递给正则表达式。是的,这正是我所想的。根据这个逻辑,re.compile(“\\”)
应该匹配一个文本反斜杠,因为第一个\删除了下面\的任何特殊含义。