首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

Python正则表达式匹配反斜杠“” \

2024-09-27 来源:华佗小知识

Python正则表达式匹配反斜杠“” \,供大家参考。

Python正则表达式匹配反斜杠“”

在Python正则式的过程中,有⼀个问题⼀直困扰我,如何去匹配⼀个反斜杠(即“\”)?

⼀、引⼊

在学习了Python特殊字符和原始字符串之后,我觉得答案应该是这样的:

1)普通字符串:"\\"

2)原始字符串:r"\"

但事实上在提取诸如“3\8”反斜杠之前的数字时,我屡次碰壁,始终得不到结果。最终发现⾃⼰理解错了,原来 原始字符串和“正则转义”没有⼀点关系;下⾯详细谈⼀谈。

⼆、字符串转义

反斜杠,在Python中⽐较特殊,就是它可以⽤来构成⼀些特殊字符,⽐如“\n”表⽰换⾏,“\t”表⽰制表符。下⾯是使⽤“\n”的⼀⾏代码:

print "Hello\World\nPython"

结果为:

“Hello\World

Python“

可以看到其中的“\n”已转义为换⾏符,⽽“\W”没有发⽣转义,原因是“\W”在“字符串转义”中并不对应着特殊字符,没有特殊含义。

如果现在要求变了,要求不对“\n”转义为换⾏,⽽是原封不动输出为“Hello\World\nPython”,该怎么办呢?

1)可以这样写“Hello\World\\nPython”,这样输出的时候,“字符串转义”会把“\\”转义为“\”;

2)也可使⽤另⼀种⽅法:原始字符串;原始字符串(即r"..."):字符串中所有字符都直接按照字⾯意思来使⽤,不转义特殊字符。

下⾯是使⽤原始字符串的代码:

print r"Hello\World\nPython"

结果为:

“Hello\World\nPython”

可以清楚看到,在使⽤原始字符串之后,“\n”未被转义为换⾏符,⽽是直接被输出了。

三、正则转义

好了,上⾯讲的只是“字符串转义”。同理,在正则表达式中也存在转义,我们姑且先称其为“正则转义”,其与“字符串转义”完全不同,⽐如“\d”数字,“\s”代表空⽩符。下⾯我们先编写开头的例⼦,然后再分析。

提取“3\8”反斜杠之前的数字:

#!/usr/bin/env python

# coding=utf-8

import re

string = "3\8"

m = re.search("(\d+)\\\\", string)

if m is not None:

print m.group(1) # 结果为:3

n = re.search(r"(\d+)\\", string)

if n is not None:

print n.group(1) # 结果为:3

正则表达式字符串需要经过两次转义,这两次分别是上⾯的“字符串转义”和“正则转义”,个⼈认为“字符串转义”⼀定先于“正则转义”。

1)"\\\\"的过程:

先进⾏“字符串转义”,前两个反斜杠和后两个反斜杠分别被转义成了⼀个反斜杠;即“\\|\\”被转成了“\|\”(“|”为⽅便看清,请⾃动忽略)。“字符串转义”后马上进⾏“正则转义”,“\\”被转义为了“\”,表⽰该正则式需要匹配⼀个反斜杠。

2)r"\\"的过程:

由于原始字符串中所有字符直接按照字⾯意思来使⽤,不转义特殊字符,故不做“字符串转义”,直接进⼊第⼆步“正则转义”,在正则转义中“\\”被转义为了“\”,表⽰该正则式需要匹配⼀个反斜杠。

四、结论

也就是说原始字符串(即r"...")与“正则转义”毫⽆关系,原始字符串仅在“字符串转义”中起作⽤,使字符串免去⼀次转义。

也许有哥们会问,为什么“\d+\\\\”中的“\d+”即使没⽤原始字符串,也没出现什么问题。那是因为在做“字符串转义”时,“\d”并不对应特殊字符,所以顺利的留到了“正则转义”时再处理,在“正则转义”中其表⽰数字。

参考⾃《Python核⼼编程》第⼆版,如有不恰当的地⽅,还望包容和指出,感谢。

显示全文