为什么re.sub()不是在Python 3.6工作吗?



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

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

时不会。我想知道我是否做错了什么。有人能帮你检查一下吗?

技术细节:

  • Python版本:3.6。
  • 操作系统:Windows 10
  • 要安装的库:openpyxl
  • utf - 8编码
  • 表情符号Unicode

这是我最初的内容:

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)

但是我仍然不能从字符串中删除非法字符。

您可以在这里下载脚本和示例测试:

重现问题的步骤:

  • 按原样运行脚本(不需要向脚本发送参数),您将注意到不匹配的行是带有非法字符的行。

我会将所有这些替换为对str.translate的单个调用,因为您只进行单字符到单字符的替换。

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

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

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

最新更新