我对正则表达式中的反斜杠感到困惑。在正则表达式中\
有特殊含义,例如\d
表示十进制数字。如果在反斜杠前面添加反斜杠,则这种特殊含义就会丢失。在里面正则表达式指南 https://docs.python.org/3/howto/regex.html#regex-howto人们可以读到:
也许最重要的元字符是反斜杠,\
。与 Python 字符串文字一样,反斜杠后面可以跟各种字符来表示各种特殊序列。它还用于转义所有元字符,以便您仍然可以按模式匹配它们;例如,如果您需要匹配[
or \
,您可以在它们前面加上反斜杠以删除它们的特殊含义:\[
or \\
.
So print(re.search('\d', '\d'))
gives None
因为\d
匹配任何十进制数字,但没有\d
.
我现在会期望print(re.search('\\d', '\d'))
匹配\d
但答案仍然是None
.
Only print(re.search('\\\d', '\d'))
给出作为输出<_sre.SRE_Match object; span=(0, 2), match='\\d'>
.
有人有解释吗?
造成混乱的原因是反斜杠字符\
被用作两个不同层面的逃生通道。首先,Python解释器本身执行替换\
之前re
模块曾经看到过你的字符串。例如,\n
转换为换行符,\t
被转换为制表符等。要获得实际的\
字符,你也可以逃避它,所以\\
给出一个\
特点。如果后面的字符\
不是公认的转义字符,那么\
被像任何其他角色一样对待并通过,但我不建议依赖于此。相反,总是逃避你的\
字符加倍,即\\
.
如果您想了解 Python 如何扩展字符串转义符,只需打印出该字符串即可。例如:
s = 'a\\b\tc'
print(s)
If s
是聚合数据类型的一部分,例如列表或元组,如果打印该聚合,Python 会将字符串括在单引号中,并包含\
转义(以规范形式),因此请注意字符串的打印方式。如果您只是在解释器中输入带引号的字符串,它也会显示用引号括起来的字符串\
逃脱。
一旦你知道你的字符串是如何编码的,你就可以考虑什么re
模块会处理它。比如说,如果你想逃离\
在你传递给的字符串中re
模块,您需要通过\\
to re
,这意味着您需要使用\\\\
在你引用的Python字符串中。 Python 字符串将以\\
和re
模块会将其视为单个文字\
特点。
另一种包含方式\
Python 字符串中的字符是使用原始字符串,例如r'a\b'
相当于"a\\b"
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)