为什么Python 3的常规字符串替换会吞下字符?

lb3vh1jj  于 2023-03-24  发布在  Python
关注(0)|答案(1)|浏览(121)
import re

base_path = "c:\\five"
print(base_path)
filename = "<data>\\a.txt"
filename = re.sub(r'(?i)<data>', base_path, filename) 
print(filename)

输出:

c:\five
c:
ive\a.txt

通常应该是:c:\five\a.txt .
同样的代码在Python 2中不会这样做。
将其更改为类似下面的内容会导致相同的结果。

reg = re.compile(re.escape('<data_path>'), re.IGNORECASE)
filename = reg.sub(base_path, filename)
igsr9ssn

igsr9ssn1#

c:\\five经过re.sub时,它变成了c:\five(包含一个\f换页字符)。它在替换字符串中这样做有点奇怪,但你可以将反斜杠作为c:\\\\five进行双转义。或者你可以将替换作为一个函数传递,这将避免这种正则表达式处理:

base_path = "c:\\five"
filename = "<data>\\a.txt"
filename = re.sub(r'(?i)<data>', lambda _: base_path, filename) 
print(filename)

输出:c:\five\a.txt
详情请参见文档:
repl可以是字符串或函数;如果它是一个字符串,则处理其中的任何反斜杠转义。也就是说,\n被转换为单个换行符,\r被转换为回车符,依此类推。

相关问题