为了账号安全,请及时绑定邮箱和手机立即绑定

用单个空格替换非ASCII字符

用单个空格替换非ASCII字符

白猪掌柜的 2019-08-01 14:18:59
用单个空格替换非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字符?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

你的''.join()表达式是过滤,删除任何非ASCII; 您可以使用条件表达式:

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

这将逐个处理字符,并且每个字符仍然会替换一个空格。

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

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

请注意+那里。


查看完整回答
反对 回复 2019-08-01
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

对于你来说,获得最相似的原始字符串表示我推荐使用unidecode模块

from unidecode import unidecodedef remove_non_ascii(text):
    return unidecode(unicode(text, encoding = "utf-8"))

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

remove_non_ascii("Ceñía")
Cenia


查看完整回答
反对 回复 2019-08-01
?
ITMISS

TA贡献1871条经验 获得超8个赞

对于字符处理,请使用Unicode字符串:


PythonWin 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32.

>>> s='ABC马克def'

>>> import re

>>> re.sub(r'[^\x00-\x7f]',r' ',s)   # Each char is a Unicode codepoint.

'ABC  def'

>>> b = s.encode('utf8')

>>> re.sub(rb'[^\x00-\x7f]',rb' ',b) # Each char is a 3-byte UTF-8 sequence.

b'ABC      def'

但请注意,如果您的字符串包含已分解的Unicode字符(例如,单独的字符和组合重音符号),您仍会遇到问题:


>>> s = 'mañana'

>>> len(s)

6

>>> import unicodedata as ud

>>> n=ud.normalize('NFD',s)

>>> n

'mañana'

>>> len(n)

7

>>> re.sub(r'[^\x00-\x7f]',r' ',s) # single codepoint

'ma ana'

>>> re.sub(r'[^\x00-\x7f]',r' ',n) # only combining mark replaced

'man ana'


查看完整回答
反对 回复 2019-08-01
  • 3 回答
  • 0 关注
  • 539 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信