首页 > 解决方案 > 为什么 re.sub() 在 Python 3.6 中不起作用?

问题描述

我正在做一个项目,我必须从 Excel 电子表格中读取数据。我正在使用 Python。

我注意到当我使用“re.sub()”时,原始字符串中的字符不会被替换。当我使用“string.replace()”时,原始字符串中的字符会被替换,但当我使用“re.sub()”时不会。

我想知道我是否做错了什么。有人可以请你检查一下吗?

技术细节:

这是我最初拥有的:

string = re.sub(u'([\u2000-\u206f])', " ", string)
string = re.sub(u'(\u00a0)', " ", string)

string = string.replace("‰", " ") #\u0089
string = string.replace("¤", " ") #\u00a4

按照“chepner”的建议,我将逻辑更改为以下内容:

replacementDict = {}
replacementDict.update(dict.fromkeys(map(chr, range(0x2000, 0x206f)), " "))
replacementDict['\u00a0'] = " "
replacementDict['\u0089'] = " "
replacementDict['\u00a4'] = " "

string = string.translate(replacementDict)

但我仍然无法从字符串中删除非法字符。

您可以在此处下载脚本和示例测试:

重现问题的步骤:

标签: pythonregexasciirenon-ascii-characters

解决方案


我会用一次调用来替换所有这些str.translate,因为您只是在进行单字符到单字符的替换。

您只需要定义一个dict(您可以在每次调用时重复使用str.translate)将每个字符映射到其替换。保持不变的字符不需要添加到映射中。

replacements = {}
replacements.update(dict.fromkeys(range(0x2000, 0x2070), " "))
replacements[0x1680] = ' '
# etc

string = string.translate(replacements)

您还可以使用str.maketrans从字符到字符的映射构造适当的转换表。


推荐阅读