用单个空格替换非 ASCII 字符

新手上路,请多包涵

我需要用空格替换所有非 ASCII (\x00-\x7F) 字符。令我惊讶的是,这在 Python 中并不简单,除非我遗漏了什么。以下函数只是删除所有非 ASCII 字符:

 def remove_non_ascii_1(text):

    return ''.join(i for i in text if ord(i)<128)

而这个根据字符代码点中的字节数用空格数替换非 ASCII 字符(即 字符替换为 3 个空格):

 def remove_non_ascii_2(text):

    return re.sub(r'[^\x00-\x7F]',' ', text)

如何用一个空格替换所有非 ASCII 字符?

无数 类似 SO 问题 没有 解决 字符 替换 不是 剥离 问题, 并且 还解决 所有非 ascii 字符而不是特定字符。

原文由 dotancohen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 582
2 个回答

您的 ''.join() 表达式正在 _过滤_,删除任何非 ASCII 的内容;您可以改用条件表达式:

 return ''.join([i if ord(i) < 128 else ' ' for i in text])

这会一个一个地处理字符,并且每个替换的字符仍会使用一个空格。

您的正则表达式应该只用空格替换 连续 的非 ASCII 字符:

 re.sub(r'[^\x00-\x7F]+',' ', text)

注意那里的 +

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

为了让您获得与原始字符串最相似的表示形式,我推荐 使用 unidecode 模块

 # python 2.x:
from unidecode import unidecode
def remove_non_ascii(text):
    return unidecode(unicode(text, encoding = "utf-8"))

然后你可以在字符串中使用它:

 remove_non_ascii("Ceñía")
Cenia

原文由 Alvaro Fuentes 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题