Как проверить, есть ли строка в Python в ASCII? - PullRequest
183 голосов
/ 13 октября 2008

Я хочу проверить, есть ли строка в ASCII или нет.

Мне известно о ord(), однако, когда я пытаюсь ord('é'), у меня появляется TypeError: ord() expected a character, but string of length 2 found. Я понял, что это вызвано тем, как я собрал Python (как объяснено в документации ord() )

Есть ли другой способ проверить?

Ответы [ 16 ]

2 голосов
/ 14 октября 2008

Строка (str -типа) в Python представляет собой серию байтов. невозможно просто сказать, глядя на строку, представляют ли эти серии байтов строку ascii, строку в 8-битном кодировке, например, ISO-8859-1, или строку, закодированную с помощью UTF-8. или UTF-16 или что-то еще.

Однако, если вы знаете используемую кодировку, тогда вы можете decode str в строку Unicode, а затем использовать регулярное выражение (или цикл), чтобы проверить, содержит ли он символы вне диапазона, который вас беспокоит.

2 голосов
/ 13 октября 2008

Вы можете использовать библиотеку регулярных выражений, которая принимает определение стандарта Posix [[: ASCII:]].

0 голосов
/ 28 октября 2016

Как и у ответа @ RogerDahl , но более эффективно замыкать, отрицая класс символов и используя поиск вместо find_all или match.

>>> import re
>>> re.search('[^\x00-\x7F]', 'Did you catch that \x00?') is not None
False
>>> re.search('[^\x00-\x7F]', 'Did you catch that \xFF?') is not None
True

Я думаю, что регулярное выражение хорошо оптимизировано для этого.

0 голосов
/ 30 сентября 2015
import re

def is_ascii(s):
    return bool(re.match(r'[\x00-\x7F]+$', s))

Чтобы включить пустую строку в качестве ASCII, измените + на *.

0 голосов
/ 08 июля 2013

Чтобы предотвратить сбои вашего кода, вы можете использовать try-except для перехвата TypeErrors

>>> ord("¶")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found

Например

def is_ascii(s):
    try:
        return all(ord(c) < 128 for c in s)
    except TypeError:
        return False
0 голосов
/ 21 июля 2010

Я использую следующее, чтобы определить, является ли строка ascii или unicode:

>> print 'test string'.__class__.__name__
str
>>> print u'test string'.__class__.__name__
unicode
>>> 

Затем просто используйте условный блок для определения функции:

def is_ascii(input):
    if input.__class__.__name__ == "str":
        return True
    return False
...