ASCII olmayan karakterleri tek bir alanla değiştirin

tüm ASCII olmayan (\x00-\x7F) karakterleri bir alanla değiştirmem gerekiyor. Bir şey kaçırmadığım sürece, bunun Python'da ölü kolay olmadığına şaşırdım. Aşağıdaki işlev, ASCII olmayan tüm karakterleri kaldırır:

def remove_non_ascii_1(text):

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

ve bu, ASCII olmayan karakterlerin karakter kod noktasındaki bayt miktarına göre boşluk miktarı ile değiştirir (yani karakteri 3 boşlukla değiştirilir):

def remove_non_ascii_2(text):

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

ASCII olmayan tüm karakterleri tek bir alanla nasıl değiştirebilirim?

SO ' , none adres karakter değiştirme as , to , , ve ayrıca tüm ascıı olmayan karakterleri belirli bir karakter değil Adres.

181
tarihinde sordu Community 2013-11-19 22:09:03
kaynak

6 ответов

your ''.join() expression is filtering , removing anything non-ASCII; bunun yerine koşullu bir ifade kullanabilirsiniz:

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

bu, karakterleri tek tek işler ve hala karakter başına bir boşluk kullanır.

normal ifadeniz, ardışık ASCII olmayan karakterleri bir alanla değiştirmelidir:

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

not + orada.

178
cevap Martijn Pieters 2013-11-19 22:11:35
kaynak

sizin için unidecode modülü :

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

sonra bir dize kullanabilirsiniz:

remove_non_ascii("Ceñía")
Cenia
32
cevap Alvaro Fuentes 2018-02-22 20:58:00
kaynak

için karakter işleme, Unicode dizeleri kullanın:

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'

ancak dizenizin ayrıştırılmış Unicode karakterleri (ayrı karakter ve vurgu işaretlerini birleştirerek) içeriyorsa, yine de bir sorun yaşayacağınızı unutmayın:

>>> 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'
17
cevap Mark Tolonen 2013-11-20 01:26:15
kaynak

eğer yedek karakter olabilir'?'bir boşluk yerine, result = text.encode('ascii', 'replace').decode() :

öneriyorum
"""Test the performance of different non-ASCII replacement methods."""


import re
from timeit import timeit


# 10_000 is typical in the project that I'm working on and most of the text
# is going to be non-ASCII.
text = 'Æ' * 10_000


print(timeit(
    """
result = ''.join([c if ord(c) < 128 else '?' for c in text])
    """,
    number=1000,
    globals=globals(),
))

print(timeit(
    """
result = text.encode('ascii', 'replace').decode()
    """,
    number=1000,
    globals=globals(),
))

sonuçlar:

0.7208260721400134
0.009975979187503592
6
cevap AXO 2017-01-03 14:12:33
kaynak

peki ya bu?

def replace_trash(unicode_string):
     for i in range(0, len(unicode_string)):
         try:
             unicode_string[i].encode("ascii")
         except:
              #means it's non-ASCII
              unicode_string=unicode_string[i].replace(" ") #replacing it with a single space
     return unicode_string
4
cevap parsecer 2016-08-21 01:35:18
kaynak

yerel ve verimli bir yaklaşım olarak, ord veya karakterler üzerinde herhangi bir döngü kullanmanız gerekmez. Sadece ascii ile kodlayın ve hataları görmezden gelin.

aşağıdakiler ascıı olmayan karakterleri kaldıracaktır:

new_string = old_string.encode('ascii',errors='ignore')

şimdi silinen karakterleri değiştirmek istiyorsanız aşağıdakileri yapın:

final_string = new_string + b' ' * (len(old_string) - len(new_string))
1
cevap Kasrâmvd 2018-01-23 17:39:32
kaynak

Diğer sorular python encoding unicode ascii