Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 对正则表达式中的反斜杠感到困惑吗_Python_Regex - Fatal编程技术网

Python 对正则表达式中的反斜杠感到困惑吗

Python 对正则表达式中的反斜杠感到困惑吗,python,regex,Python,Regex,我对正则表达式中的反斜杠感到困惑。在正则表达式中,\具有特殊含义,例如,\d表示十进制数字。如果在反斜杠前面加一个反斜杠,这个特殊的意思就会消失。在这本书中,你可以读到: 也许最重要的元字符是反斜杠,\。与Python字符串文字一样,反斜杠后面可以跟有各种字符,以表示各种特殊序列。它还用于转义所有元字符,以便您仍然可以在模式中匹配它们;例如,如果需要匹配一个[或\,则可以在它们前面加一个反斜杠以删除它们的特殊含义:\[或\ 所以print(重新搜索('\d','\d'))给出None,因为\d匹

我对正则表达式中的反斜杠感到困惑。在正则表达式中,
\
具有特殊含义,例如,
\d
表示十进制数字。如果在反斜杠前面加一个反斜杠,这个特殊的意思就会消失。在这本书中,你可以读到:

也许最重要的元字符是反斜杠,
\
。与Python字符串文字一样,反斜杠后面可以跟有各种字符,以表示各种特殊序列。它还用于转义所有元字符,以便您仍然可以在模式中匹配它们;例如,如果需要匹配一个
[
\
,则可以在它们前面加一个反斜杠以删除它们的特殊含义:
\[
\

所以
print(重新搜索('\d','\d'))
给出
None
,因为
\d
匹配任何十进制数字,但
\d
中没有

我现在希望
print(重新搜索('\\d','\d'))
匹配
\d
,但答案仍然是
None

只有
打印(重新搜索('\\\d','\d'))
作为输出提供


有人有解释吗?

Python自己的字符串解析(部分)妨碍了您

如果要查看
re
看到的内容,请键入

print '\d'
print '\\d'
print '\\\d'
在Python命令提示符上。您可以看到
\d
\\d
都会导致
\d
,后者由Python字符串解析器处理


如果您想避免这些问题,请按照以下建议使用原始字符串:
r'\\d'
将导致RE模块看到
\\d

混淆是因为反斜杠字符
\
在两个不同的级别被用作转义符。首先,Python解释器本身执行替换对于
\
,在
re
模块看到您的字符串之前。例如,
\n
被转换为换行符,
\t
被转换为制表符,等等。要获得实际的
\
字符,您也可以对其进行转义,因此
\
给出一个
\
字符。如果由于
\
不是可识别的转义字符,那么
\
将被视为与任何其他字符一样并被传递,但我不建议依赖于此。相反,请始终通过将
\
字符加倍来转义它们,即
\

如果您想了解Python如何扩展字符串转义,只需打印字符串即可。例如:

s = 'a\\b\tc'
print(s)
如果
s
是聚合数据类型的一部分,例如列表或元组,并且如果打印该聚合,Python会将字符串括在单引号中,并包含
\
转义符(以规范形式),因此请注意字符串的打印方式。如果您只是在解释器中键入带引号的字符串,解释器也会将其显示在带引号的
\
转义符中

一旦您知道字符串是如何编码的,您就可以考虑
re
模块将如何处理它。例如,如果您想在传递给
re
模块的字符串中转义
\
,则需要将
\\
传递给
re
,这意味着您需要在自己的代码中使用
\\\\
ted Python字符串。Python字符串将以
\\
结束,
re
模块将其视为单个文本
\
字符

>>> s = '\\t'
>>> print ("[" + s  + "]")
>>> [\t]                // '\t' after preprocessing

在Python字符串中包含
\
字符的另一种方法是使用原始字符串,例如
r'a\b'
相当于调用search()时正则表达式前面的
“a\\b”
字符指定正则表达式为原始字符串。这允许反斜杠作为正则字符在正则表达式中使用,而不是在转义字符序列中使用。让我解释一下

在re模块的搜索方法处理传递给它的字符串之前,Python解释器对字符串进行初始传递。如果字符串中存在反斜杠,Python解释器必须确定每个字符串是否都是Python转义序列的一部分(例如。\n或\t)

注意:此时Python并不关心“\”是否是正则表达式元字符

>>> s = '\\t'
>>> print ("[" + s  + "]")
>>> [\t]                // '\t' after preprocessing
如果“\”后跟可识别的Python转义字符(t、n等),则反斜杠和转义字符将替换为实际的Unicode或8位字符。例如,“\t”将替换为用于制表符的ASCII字符。否则,它将被传递并解释为“\”字符

>>> s = '\\t'
>>> print ("[" + s  + "]")
>>> [\t]                // '\t' after preprocessing
考虑以下几点

>>> s = '\t'
>>> print ("[" + s  + "]")
>>> [       ]           // an actual tab character after preprocessing

>>> s = '\d'
>>> print ("[" + s  + "]")
>>> [\d]                // '\d' after preprocessing
有时,我们希望在字符串中包含一个包含“\”的字符序列,而不将其解释为转义序列。为此,我们用“\”转义“\”。现在,当Python看到“\”时,它将用单个“\”字符替换两个反斜杠

>>> s = '\\t'
>>> print ("[" + s  + "]")
>>> [\t]                // '\t' after preprocessing
Python解释器传递两个字符串后,它们被传递到re模块的搜索方法。搜索方法解析正则表达式字符串以识别正则表达式的元字符

现在“\”也是一个特殊的正则表达式元字符,除非在执行research()方法时转义它,否则它将被解释为一个

考虑下面的调用

>>> match = re.search('a\\t','a\\t')        //Match is None
>>> match = re.search('a\\\\t','a\\t')          // Match contains 'a\t'
这里,match是None。为什么?让我们在Python解释器通过后看看字符串

String 1: 'a\t'
String 2: 'a\t' 
那么为什么match等于None呢解释字符串1,因为它是正则表达式,所以反斜杠被解释为元字符,而不是普通字符。但是,字符串2中的反斜杠不在正则表达式中,并且已经由Python解释器处理,因此它被解释为普通字符

>>> s = '\\t'
>>> print ("[" + s  + "]")
>>> [\t]                // '\t' after preprocessing
因此search()方法在字符串“a\t”中查找“a escape-t”,其中