Comment supprimer efficacement les caractères et les nombres non-ASCII, tout en conservant les caractères ASCII accentués

Nacho

J'ai plusieurs chaînes comme celle-ci:

s = u'awëerwq\u0645\u0631\u062d\u0628\u0627\u043c\u0438\u0440bròn 1990 23x4 + &23 \'we\' we\'s mexicqué'
s
"awëerwq مرحباмир bròn 1990 23x4 + &23 'we' we's mexicqué"

Je n'ai pas trouvé de moyen de supprimer les éléments non imprimables comme «مرحبا ми», mais en gardant les caractères latins comme «óé, ...». Les nombres (comme «1990») ne sont pas non plus souhaitables dans mon cas. J'ai utilisé le ASCIIdrapeau de remais je ne sais pas ce qui ne va pas parce qu'il supprime «óëé, ...». C'est le même problème avec l'utilisation string.printable. Je ne sais pas pourquoi

ord('ë')
235

Étant donné que la table ASCII est affectée à 137. Le résultat auquel je m'attends est quelque chose comme ceci:

x = some_method(s)
"awëerwq bròn 23x4 we we s mexicqué" 

Ensuite, je voudrais coder sans dépendre d'une codification non fixée.

Seth

Voici un moyen qui pourrait aider (Python 3.4):

import unicodedata
def remove_nonlatin(s): 
    s = (ch for ch in s
         if unicodedata.name(ch).startswith(('LATIN', 'DIGIT', 'SPACE')))
    return ''.join(s)

>>> s = 'awëerwq\u0645\u0631\u062d\u0628\u0627\u043c\u0438\u0440bròn 1990 23x4 + &23 \'we\' we\'s mexicqué'
>>> remove_nonlatin(s)
'awëerwqbròn 1990 23x4  23 we wes mexicqué'

Cela saisit les noms Unicode des caractères de la chaîne et correspond aux caractères dont les noms commencent par LATIN, DIGIT ou SPACE.

Par exemple, cela correspondrait:

>>> unicodedata.name('S')
'LATIN CAPITAL LETTER S'

Et ce ne serait pas:

>>> unicodedata.name('م')
'ARABIC LETTER MEEM'

Je suis raisonnablement sûr que les caractères latins ont tous des noms unicode commençant par «LATIN», donc cela devrait filtrer les autres scripts d'écriture, tout en conservant les chiffres et les espaces. Il n'y a pas de ligne unique pratique pour la ponctuation, donc dans cet exemple, les points d'exclamation et autres sont également filtrés.

Vous pouvez probablement filtrer par point de code en utilisant quelque chose comme ord(c) < 0x250, bien que vous puissiez obtenir des choses auxquelles vous ne vous attendez pas. Ou, vous pouvez essayer de filtrer par unicodedata.category. Cependant, la catégorie «lettre» comprend des lettres provenant de nombreux scripts, vous vous retrouverez donc toujours avec certains d'entre eux: «م».

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Microsoft.WebApplication.targets

  2. 2

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  3. 3

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  4. 4

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  5. 5

    Passer la taille d'un tableau 2D à une fonction ?

  6. 6

    Exporter la table de l'arborescence vers CSV avec mise en forme

  7. 7

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  8. 8

    Créer un système Buzzer à l'aide de python

  9. 9

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  10. 10

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  11. 11

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  12. 12

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  13. 13

    Conversion double en BigDecimal en Java

  14. 14

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  15. 15

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  16. 16

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  17. 17

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  18. 18

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  19. 19

    comment afficher un bouton au-dessus d'un autre élément ?

  20. 20

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  21. 21

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

chaudétiquette

Archive