Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python和regex模块如何处理反斜杠_Python_Regex_Python 3.4 - Fatal编程技术网

python和regex模块如何处理反斜杠

python和regex模块如何处理反斜杠,python,regex,python-3.4,Python,Regex,Python 3.4,我目前从语言参考中对Python3.4正则表达式库的理解似乎与我对模块的实验结果不符 我目前的理解 正则表达式引擎可以看作是一个独立的实体,它有自己的编程语言(regex)。它恰好存在于python内部,以及各种其他语言中。因此,如果愿意,python必须将(regex)模式/代码传递给这个独立的解释器 为了清楚起见,以下文本将使用逻辑长度的概念——它应该表示给定字符串的逻辑长度。例如,特殊字符回车\r将具有len=1,因为它是单个字符。但是,两个不同的字符(反斜杠后跟r)\r将具有len=2

我目前从语言参考中对Python3.4正则表达式库的理解似乎与我对模块的实验结果不符


我目前的理解 正则表达式引擎可以看作是一个独立的实体,它有自己的编程语言(regex)。它恰好存在于python内部,以及各种其他语言中。因此,如果愿意,python必须将(regex)模式/代码传递给这个独立的解释器

为了清楚起见,以下文本将使用
逻辑长度的概念
——它应该表示给定字符串的逻辑长度。例如,特殊字符回车
\r
将具有
len=1
,因为它是单个字符。但是,两个不同的字符(反斜杠后跟r)
\r
将具有
len=2

1) 假设我们希望在某些文本中匹配回车
\r len=1

2) 我们需要将模式
\r len=2
(2个不同的字符)提供给正则表达式引擎

3) 正则表达式引擎接收
\r len=2
,并将模式解释为:匹配特殊字符回车
\r len=1

4) 它继续前进,发挥着神奇的作用

问题在于,python解释器将反斜杠字符
\
本身作为特殊的东西使用——一个用于转义其他内容(如引号)的字符

因此,当我们用python编码时,需要表达我们需要将模式
\r len=2
发送到内部正则表达式解释器的想法,我们必须键入
pattern='\\r'
或者
pattern=r'\r'
来表示
\r len=2


一切都很好。。。直到 我尝试了两个涉及
re.escape


问题摘要 1) 请确认/修改我目前对正则表达式引擎的理解

2) 为什么这些假定的非教科书定义模式匹配


3)
re.escape
中的
\\\r
到底是怎么回事,以及整个“我们有相同的字符串长度,但我们比较不相等,但在前面的
re.search
test”

中匹配回车符时,我们也都是这样做的。你需要明白,每次编写模式时,它首先被解释为字符串,然后由正则表达式引擎进行第二次读取和解释。 让我们描述一下发生了什么:

>>> s='\r'
s包含字符CR

>>> re.match('\r', s)
<_sre.SRE_Match object; span=(0, 1), match='\r'>
字符串现在是一个文本反斜杠和一个文本r,正则表达式引擎接收这两个字符,由于
\r
是一个正则表达式转义序列,也意味着一个CR字符,因此您也获得了一个匹配

>>> re.match('\\\r', s)
<_sre.SRE_Match object; span=(0, 1), match='\r'>
重新匹配('\\\r',s) 字符串包含文本反斜杠和文本CR,正则表达式引擎接收
\
CR
,但由于
\CR
不是已知的正则表达式转义序列,因此将忽略反斜杠并获得匹配


请注意,对于正则表达式引擎,文本反斜杠是转义序列
\\\
(因此在模式字符串
r'\\\'
'\\\\'
中)

以后请发布格式化文本,而不是屏幕截图。这使得其他人更容易复制和粘贴以在本地复制您的问题,并且使用屏幕阅读器等的人也更容易访问。当您在上一个示例中说反斜杠被忽略时
\CR
,这是否意味着正则表达式引擎会无声地将
\CR
转换为
CR
?那么任何未知序列都会变成代码(从反斜杠中去掉)?假设
\X
\Y
\Z
都是未知的,那么
pat\Xte\Yrn\Z
也会悄悄地变成
pattern
?@Alan:没错,测试你自己:
re.match(r'\l',l')
re.match('\\l',l')
。只有反斜杠被忽略,以下字符不被忽略:
pat\Xte\Yrn\K
对于正则表达式引擎变为
patxternk
。(
\Z
具有特殊含义)
>>> re.match('\\\r', s)
<_sre.SRE_Match object; span=(0, 1), match='\r'>