为什么 re.sub() 在 Python 3.6 中不起作用?
Why Does re.sub() Not Work in Python 3.6?
我正在做一个项目,我必须从 Excel 电子表格中读取数据。我正在使用 Python.
我注意到当我使用“re.sub()”时,原始字符串中的字符没有被替换。当我使用“string.replace()”时,原始字符串中的字符会被替换,但当我使用“re.sub()”时不会。
我想知道我是否做错了什么。
任何人都可以在您这边检查一下吗?
技术细节:
- Python版本:3.6.
- 操作系统:Windows10
- 要安装的库:openpyxl
- UTF-8 codes
- Unicode for emojis
这是我原来的:
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)
但我仍然无法从字符串中删除非法字符。
您可以下载脚本和示例测试here:
重现问题的步骤:
- 运行 脚本原样(删除了向脚本发送参数的需要),您会注意到不匹配的行是带有非法字符的行。
我会用一次调用 str.translate
来替换所有这些,因为您只是在进行单个字符到单个字符的替换。
您只需定义一个 dict
(您可以在每次调用 str.translate
时重复使用)将每个字符映射到其替换字符。保持不变的字符不需要添加到映射中。
replacements = {}
replacements.update(dict.fromkeys(range(0x2000, 0x2070), " "))
replacements[0x1680] = ' '
# etc
string = string.translate(replacements)
您还可以使用 str.maketrans
从字符到字符映射构建适当的翻译 table。
我正在做一个项目,我必须从 Excel 电子表格中读取数据。我正在使用 Python.
我注意到当我使用“re.sub()”时,原始字符串中的字符没有被替换。当我使用“string.replace()”时,原始字符串中的字符会被替换,但当我使用“re.sub()”时不会。
我想知道我是否做错了什么。 任何人都可以在您这边检查一下吗?
技术细节:
- Python版本:3.6.
- 操作系统:Windows10
- 要安装的库:openpyxl
- UTF-8 codes
- Unicode for emojis
这是我原来的:
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)
但我仍然无法从字符串中删除非法字符。
您可以下载脚本和示例测试here:
重现问题的步骤:
- 运行 脚本原样(删除了向脚本发送参数的需要),您会注意到不匹配的行是带有非法字符的行。
我会用一次调用 str.translate
来替换所有这些,因为您只是在进行单个字符到单个字符的替换。
您只需定义一个 dict
(您可以在每次调用 str.translate
时重复使用)将每个字符映射到其替换字符。保持不变的字符不需要添加到映射中。
replacements = {}
replacements.update(dict.fromkeys(range(0x2000, 0x2070), " "))
replacements[0x1680] = ' '
# etc
string = string.translate(replacements)
您还可以使用 str.maketrans
从字符到字符映射构建适当的翻译 table。