Comment vérifier qu'une chaîne ne contient que des caractères ASCII en Python? Quelque chose comme ascii_only? de Ruby

Je veux pouvoir dire si les données spécifiques aux chaînes lues dans le fichier sont en ascii

11
JavaSa 9 mars 2016 à 13:52

4 réponses

Meilleure réponse

En Python 3.7 ont été ajoutées des méthodes qui font ce que vous voulez:

str, bytes et bytearray ont pris en charge le nouveau isascii(), méthode qui peut être utilisée pour tester si une chaîne ou des octets ne contiennent que les caractères ASCII.


Autrement:

>>> all(ord(char) < 128 for char in 'string')
>>> True

>>> all(ord(char) < 128 for char in 'строка')
>>> False

Une autre version:

>>> def is_ascii(text):
    if isinstance(text, unicode):
        try:
            text.encode('ascii')
        except UnicodeEncodeError:
            return False
    else:
        try:
            text.decode('ascii')
        except UnicodeDecodeError:
            return False
    return True
...

>>> is_ascii('text')
>>> True

>>> is_ascii(u'text')
>>> True

>>> is_ascii(u'text-строка')
>>> False

>>> is_ascii('text-строка')
>>> False

>>> is_ascii(u'text-строка'.encode('utf-8'))
>>> False
25
warvariuc 29 juin 2018 à 06:31

Une solution de contournement à votre problème serait d'essayer de coder la chaîne dans un codage particulier.

Par exemple:

'H€llø'.encode('utf-8')

Cela générera l'erreur suivante:

Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal not in range(128)

Vous pouvez maintenant intercepter "UnicodeDecodeError" pour déterminer que la chaîne ne contenait pas uniquement les caractères ASCII.

try:
    'H€llø'.encode('utf-8')
except UnicodeDecodeError:
    print 'This string contains more than just the ASCII characters.'
0
Girish Jadhav 9 mars 2016 à 11:45

Si vous avez des chaînes unicode, vous pouvez utiliser la fonction "encode" puis intercepter l'exception:

try:
    mynewstring = mystring.encode('ascii')
except UnicodeEncodeError:
    print("there are non-ascii characters in there")

Si vous avez des octets, vous pouvez importer le module chardet et vérifier l'encodage:

import chardet

# Get the encoding
enc = chardet.detect(mystring)['encoding']
3
Quentin Pradet 28 sept. 2017 à 11:29

Vous pouvez également opter pour regex pour rechercher uniquement les caractères ascii. [\x00-\x7F] peut correspondre à un seul caractère ascii:

>>> OnlyAscii = lambda s: re.match('^[\x00-\x7F]+$', s) != None
>>> OnlyAscii('string')
True
>>> OnlyAscii('Tannh‰user')
False
5
Quinn 9 mars 2016 à 15:30