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)
請注意+
那里。

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

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
'man?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'
添加回答
舉報