300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 转载Python正则表达式匹配反斜杠'\'问题(——字符串转义与正则转义)

转载Python正则表达式匹配反斜杠'\'问题(——字符串转义与正则转义)

时间:2020-09-15 18:05:28

相关推荐

转载Python正则表达式匹配反斜杠'\'问题(——字符串转义与正则转义)

个人总结(非转载部分):

1、原始字串(字符串前加r,如r’xxx’)常用在正则表达式中,在正则表达运算中,要进行正则转义(原始字串不原始)

实例:

2、普通字串若要用于正则表达式中,会先进行“字符串转义”,再进行“正则转义”

包含转义字符时,做正则操作易出错,应多注意正则转义,以下代码是对配置文件的相对路径改为绝对路径时候的部分操作(re.sub前两个参数是正则表达式相关的参数,需要小心处理)

import os import repath=r"../../conf/xxx.conf"dir=os.path.dirname(os.path.abspath(path))print(os.path.abspath(path))with open(os.path.abspath(path), "r+") as f:all_lines = f.readlines()for line in all_lines: if "./" in line:print(dir)print(re.sub(pile(r"'[.]/"),"'"+dir,line))print(dir.replace("\\","\\\\"))print(re.sub(pile(r"'[.]/"),"'"+dir.replace("\\","\\\\"),line))

以下是上述代码的执行结果(其中\a在第二个参数未替换为双斜线时,变成乱码)

D:\workspace\autotest\conf\xxx.confD:\workspace\autotest\confargs=(r'D:\workspaceutotest\conflogs/myapp.log', 'a', 10*1024*1024, 5)D:\\workspace\\autotest\\confargs=(r'D:\workspace\autotest\conflogs/myapp.log', 'a', 10*1024*1024, 5)D:\workspace\autotest\confxxx=(r'D:\workspaceutotest\conf../../../logs/myapp.log', 'a', 10*1024*1024, 5)D:\\workspace\\autotest\\confxxx=(r'D:\workspace\autotest\conf../../../logs/myapp.log', 'a', 10*1024*1024, 5)

转载自:Python正则表达式匹配反斜杠’\’问题 原文如下:

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

一、引入

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

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

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

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

二、字符串转义

反斜杠,在Python中比较特殊,就是它可以用来构成一些特殊字符,比如“\n”表示换行,“\t”表示制表符。下面是使用“\n”的一行代码:

[python]view plain copy print ? print‘Hello\World\nPython’

print 'Hello\World\nPython'

结果为:

“Hello\World

Python“

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

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

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

2)也可使用另一种方法:原始字符串;原始字符串(即r’…’):字符串中所有字符都直接按照字面意思来使用,不转义特殊字符。

下面是使用原始字符串的代码:

[python]view plain copy print ? printr‘Hello\World\nPython’

print r'Hello\World\nPython'

结果为:

“Hello\World\nPython”

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

三、正则转义

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

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

[python]view plain copy print ? #!/usr/bin/envpython#coding=utf-8importrestring=’3\8’m=re.search(’(\d+)\\\\’,string)ifmisnotNone:printm.group(1)#结果为:3n=re.search(r’(\d+)\\’,string)ifnisnotNone:printn.group(1)#结果为:3

#!/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核心编程》第二版,如有不恰当的地方,还望包容和指出,感谢。

</div>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。