转载Python正则表达式匹配反斜杠问题(——字符串转义与正则转义)
个⼈总结(⾮转载部分):
1、原始字串(字符串前加r,如r’xxx’)常⽤在正则表达式中,在正则表达运算中,要进⾏正则转义(原始字串不原始)
实例:
2、普通字串若要⽤于正则表达式中,会先进⾏“字符串转义”,再进⾏“正则转义”
包含转义字符时,做正则操作易出错,应多注意正则转义,以下代码是对配置⽂件的相对路径改为绝对路径时候的部分操作(re.sub前两个参数是正则表达式相关的参数,需要⼩⼼处理)
import os
import re
path=r"../../f"
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(repile(r"'[.]/"),"'"+dir,line))
place("\\","\\\\"))
print(re.sub(repile(r"'[.]/"),"'"+place("\\","\\\\"),line))
以下是上述代码的执⾏结果(其中\a在第⼆个参数未替换为双斜线时,变成乱码)
D:\workspace\autotest\f
D:\workspace\autotest\conf
args=(r'D:\workspaceutotest\conflogs/myapp.log', 'a', 10*1024*1024, 5)
D:\\workspace\\autotest\\conf
args=(r'D:\workspace\autotest\conflogs/myapp.log', 'a', 10*1024*1024, 5)
D:\workspace\autotest\conf
xxx=(r'D:\workspaceutotest\conf../../../logs/myapp.log', 'a', 10*1024*1024, 5)
D:\\workspace\\autotest\\conf
xxx=(r'D:\workspace\autotest\conf../../../logs/myapp.log', 'a', 10*1024*1024, 5)
转载⾃: 原⽂如下:
在学习Python正则式的过程中,有⼀个问题⼀直困扰我,如何去匹配⼀个反斜杠(即“\”)?
⼀、引⼊
在学习了Python特殊字符和原始字符串之后,我觉得答案应该是这样的:
1)普通字符串:’\\’
2)原始字符串:r’\’
但事实上在提取诸如“3\8”反斜杠之前的数字时,我屡次碰壁,始终得不到结果。最终发现⾃⼰理解错了,原来 原始字符串和“正则转义”没有⼀点关系;下⾯详细谈⼀谈。
⼆、字符串转义
反斜杠,在Python中⽐较特殊,就是它可以⽤来构成⼀些特殊字符,⽐如“\n”表⽰换⾏,“\t”表⽰制表符。下⾯是使⽤“\n”的⼀⾏代码:
[pytho n]
1. print ‘Hello\World\nPython’
print 'Hello\World\nPython'
结果为:
“Hello\World
Python“
可以看到其中的“\n”已转义为换⾏符,⽽“\W”没有发⽣转义,原因是“\W”在“字符串转义”中并不对应着特殊字符,没有特殊含义。
如果现在要求变了,要求不对“\n”转义为换⾏,⽽是原封不动输出为“Hello\World\nPython”,该怎么办呢?
1)可以这样写“Hello\World\\nPython”,这样输出的时候,“字符串转义”会把“\\”转义为“\”;
2)也可使⽤另⼀种⽅法:原始字符串;原始字符串(即r’…’):字符串中所有字符都直接按照字⾯意思来使⽤,不转义特殊字符。
下⾯是使⽤原始字符串的代码:
[pytho n]
1. print r‘Hello\World\nPython’
print r'Hello\World\nPython'
结果为:
“Hello\World\nPython”
可以清楚看到,在使⽤原始字符串之后,“\n”未被转义为换⾏符,⽽是直接被输出了。
三、正则转义
好了,上⾯讲的只是“字符串转义”。同理,在正则表达式中也存在转义,我们姑且先称其为“正则转义”,其与“字符串转义”完全不同,⽐如“\d”代表数字,“\s”代表空⽩符。下⾯我们先编写开头的例⼦,然后再分析。
提取“3\8”反斜杠之前的数字:
[pytho n]
1. #!/usr/bin/env python
2. # coding=utf-8
3.
4. import re
5.
python正则表达式不包含6. string = ’3\8’
7. m = re.search(’(\d+)\\\\’, string)
8.
9. if m is not None:
10. up(1) # 结果为:3
11.
12. n = re.search(r’(\d+)\\’, string)
13.
14. if n is not None:
15. up(1) # 结果为:3
#!/usr/bin/env python
coding=utf-8
import re
string = '3\8'
m = re.search('(\d+)\\', string)
if m is not None:
up(1) # 结果为:3
n = re.search(r'(\d+)\', string)
if n is not None:
up(1) # 结果为:3
正则表达式字符串需要经过两次转义,这两次分别是上⾯的“字符串转义”和“正则转义”,个⼈认为“字符串转义”⼀定先于“正则转义”。
1)’\\’的过程:
先进⾏“字符串转义”,前两个反斜杠和后两个反斜杠分别被转义成了⼀个反斜杠;即“\|\”被转成了“|\”(“|”为⽅便看清,请⾃动忽略)。“字符串转义”后马上进⾏“正则转义”,“\”被转义为了“\”,表⽰该
正则式需要匹配⼀个反斜杠。
2)r’\’的过程:
由于原始字符串中所有字符直接按照字⾯意思来使⽤,不转义特殊字符,故不做“字符串转义”,直接进⼊第⼆步“正则转义”,在正则转义中“\”被转义为了“\”,表⽰该正则式需要匹配⼀个反斜杠。
四、结论
也就是说原始字符串(即r’…’)与“正则转义”毫⽆关系,原始字符串仅在“字符串转义”中起作⽤,使字符串免去⼀次转义。
也许有哥们会问,为什么“\d+\\”中的“\d+”即使没⽤原始字符串,也没出现什么问题。那是因为在做“字符串转义”时,“\d”并不对应特殊字符,所以顺利的留到了“正则转义”时再处理,在“正则转义”中其表⽰数字。
参考⾃《Python核⼼编程》第⼆版,如有不恰当的地⽅,还望包容和指出,感谢。
</div>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论