为何Python 3正则字符串替换会出现字符丢失问题?
Python正则替换时字符被“吞”的原因与解决办法
你遇到的问题是替换字符串里的转义字符被解析导致的,具体分析和解决办法如下:
问题原因
代码中base_path = "c:\\five"实际存储的是c:\five,其中\f是Python的换页转义字符(ASCII 0x0C)。当用这个字符串作为re.sub的替换值时,\f会被当作特殊转义序列处理,而非普通的\加f。打印时换页符会触发换行,所以看起来像是c:后面的f被吞掉,实际是换页符让ive\a.txt跳到了下一行。
解决办法
方法1:使用原始字符串定义路径
在字符串前加r标记为原始字符串,其中的\会被当作普通字符处理,不会被解析成转义序列:
import re base_path = r"c:\five" print(base_path) filename = "<data>\\a.txt" filename = re.sub(r'(?i)<data>', base_path, filename) print(filename)
方法2:对路径中的反斜杠进行双重转义
如果不想用原始字符串,可把路径里的每个\写成\\,这样存储的字符串会保留两个反斜杠,替换后会解析为单个普通反斜杠:
import re base_path = "c:\\\\five" print(base_path) filename = "<data>\\a.txt" filename = re.sub(r'(?i)<data>', base_path, filename) print(filename)
方法3:正则编译时配合原始字符串替换值
如果用re.compile的方式,同样要保证替换字符串是原始字符串或者正确转义:
import re base_path = r"c:\five" reg = re.compile(r'(?i)<data>') filename = "<data>\\a.txt" filename = reg.sub(base_path, filename) print(filename)
运行上述任意一种写法,都能得到预期的c:\five\a.txt输出。
内容的提问来源于stack exchange,提问作者retZero
相关产品推荐
相关产品推荐

