猿问

用单个空格替换非ASCII字符

用单个空格替换非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字符?


白猪掌柜的
浏览 540回答 3
3回答

侃侃尔雅

你的''.join()表达式是过滤,删除任何非ASCII;&nbsp;您可以使用条件表达式:return&nbsp;''.join([i&nbsp;if&nbsp;ord(i)&nbsp;<&nbsp;128&nbsp;else&nbsp;'&nbsp;'&nbsp;for&nbsp;i&nbsp;in&nbsp;text])这将逐个处理字符,并且每个字符仍然会替换一个空格。您的正则表达式应该只用空格替换连续的非ASCII字符:re.sub(r'[^\x00-\x7F]+','&nbsp;',&nbsp;text)请注意+那里。

慕无忌1623718

对于你来说,获得最相似的原始字符串表示我推荐使用unidecode模块:from&nbsp;unidecode&nbsp;import&nbsp;unidecodedef&nbsp;remove_non_ascii(text): &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;unidecode(unicode(text,&nbsp;encoding&nbsp;=&nbsp;"utf-8"))然后你可以在字符串中使用它:remove_non_ascii("Ceñía") Cenia

ITMISS

对于字符处理,请使用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)&nbsp; &nbsp;# Each char is a Unicode codepoint.'ABC&nbsp; def'>>> b = s.encode('utf8')>>> re.sub(rb'[^\x00-\x7f]',rb' ',b) # Each char is a 3-byte UTF-8 sequence.b'ABC&nbsp; &nbsp; &nbsp; 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'
随时随地看视频慕课网APP

相关分类

Python
我要回答