282 votes

Remplacer les caractères non ASCII par un seul espace.

Je dois remplacer tous les caractères non ASCII ( \x00 - \x7F ) avec un espace. Je suis surpris que cela ne soit pas très facile en Python, à moins que je ne manque quelque chose. La fonction suivante supprime simplement tous les caractères non ASCII :

def remove_non_ascii_1(text):

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

Et celui-ci remplace les caractères non-ASCII par le nombre d'espaces correspondant à la quantité d'octets dans le point de code du caractère (c'est-à-dire le est remplacé par 3 espaces) :

def remove_non_ascii_2(text):

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

Comment puis-je remplacer tous les caractères non ASCII par un seul espace ?

Sur el myriade de de similaire SO questions , aucun adresse caractère remplacement comme s'est opposé à à décapage , y s'adresse en outre à tous les caractères non ascii et non à un caractère spécifique.

57 votes

Wow, vous avez vraiment fait de gros efforts pour montrer autant de liens. +1 dès que le jour se renouvelle !

3 votes

Vous semblez avoir manqué celui-ci stackoverflow.com/questions/1342000/

0 votes

J'aimerais voir un exemple d'entrée qui présente des problèmes.

5voto

Kasramvd Points 32864

En tant qu'approche native et efficace, vous n'avez pas besoin d'utiliser la fonction ord ou toute boucle sur les caractères. Il suffit de coder avec ascii et ignorez les erreurs.

Ce qui suit supprimera simplement les caractères non ascii :

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

Maintenant, si vous voulez remplacer les caractères supprimés, il suffit de faire ce qui suit :

final_string = new_string + b' ' * (len(old_string) - len(new_string))

1voto

Renuka Koya Points 11

Lorsque nous utilisons le ascii() il échappe les caractères non-ascii et il ne change pas les caractères ascii correctement. Ma pensée principale est donc qu'il ne change pas les caractères ASCII, donc j'itère à travers la chaîne et vérifie si le caractère est changé. S'il a changé, je le remplace par le substitut, ce que vous donnez.
Par exemple : " " (un seul espace) ou " ? " (avec un point d'interrogation).

def remove(x, replacer):

     for i in x:
        if f"'{i}'" == ascii(i):
            pass
        else:
            x=x.replace(i,replacer)
     return x
remove('hái',' ')

Résultat : "h i" (avec un seul espace entre les deux).

Syntaxe : remove(str,non_ascii_replacer)
str = Ici vous donnerez la chaîne de caractères avec laquelle vous voulez travailler.
non_ascii_replacer = Ici vous donnerez le substitut avec lequel vous voulez remplacer tous les caractères non ASCII.

0voto

smoquet Points 61

Mon problème était que ma chaîne de caractères contenait des choses comme Belgià pour België et &#x20AC pour le signe €. Et je ne voulais pas les remplacer par des espaces. Mais avec le bon symbole lui-même.

ma solution était string.encode('Latin1').decode('utf-8')

-1voto

seaders Points 1598

Potentiellement pour une question différente, mais je fournis ma version de la réponse de @Alvero (en utilisant unidecode). Je veux faire un strip "régulier" sur mes chaînes, c'est-à-dire le début et la fin de ma chaîne pour les caractères d'espacement, et ensuite remplacer seulement les autres caractères d'espacement par une espace "régulière", c'est-à-dire.

"Ceñíamañana"

à

"Ceñía mañana"

,

def safely_stripped(s: str):
    return ' '.join(
        stripped for stripped in
        (bit.strip() for bit in
         ''.join((c if unidecode(c) else ' ') for c in s).strip().split())
        if stripped)

Nous remplaçons d'abord tous les espaces non unicodes par un espace régulier (et nous le rejoignons à nouveau),

''.join((c if unidecode(c) else ' ') for c in s)

Puis nous divisons à nouveau le tout, avec la division normale de Python, et nous enlevons chaque "bit",

(bit.strip() for bit in s.split())

Et enfin, les réunir à nouveau, mais seulement si la chaîne de caractères passe une if test,

' '.join(stripped for stripped in s if stripped)

Et avec ça, safely_stripped('Ceñíamañana') rend correctement 'Ceñía mañana' .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X