用单个sp替换非ASCII字符

2024-06-17 13:08:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要用空格替换所有非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字符?

是的。


Tags: 函数textforreturndefascii字符remove
3条回答

对于您,我建议您使用最相似的原始字符串表示法the unidecode module

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

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

remove_non_ascii("Ceñía")
Cenia

对于字符处理,请使用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'

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

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

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

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

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

注意那里的+

相关问题 更多 >