Как удалить международные буквенно-цифровые символы в Python? - PullRequest
0 голосов
/ 03 января 2019

Я открыл свой набор данных в Python следующим образом.

with open(page_titles.txt, encoding="utf8") as fg:
    all_concepts = []
    for line in fg:
        all_concepts.append(line)

Однако в моих заголовках есть некоторые буквенно-цифровые символы, такие как Ռեթէոս_Պէրպէրեան, 丘, (جامعة_جورجتاون_ (قطر, (جامعة_جورجتاون_ (قطر, (കേരള_നിയമസഭ)).

Я хочу сохранить заголовки только на английском языке.

Я пытался сделать следующее. Тем не менее, это не решает мою проблему, поскольку говорит, что вышеупомянутые заголовки являются действительными заголовками.

def remove_non_ascii(text):
    non_ascii = 0
    ascii_letter = 0
    for c in text:
        if 0 <= ord(c) <= 127:
            # this is a ascii character.
            ascii_letter = ascii_letter + 1
        else:
            # this is a non-ascii character. Do something.
            non_ascii = non_ascii + 1

    if len(text)==non_ascii:
        print("invalid")
    else:
        print("valid")

Пожалуйста, помогите мне.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Ваша ошибка в строке if len(text)==non_ascii.Эта строка проверяет, является ли все введенные вами символы не ascii (поэтому будет допустимо, если только половина символов будет недопустимой).Вам нужно проверить, что любой из символов действителен, поэтому сделайте следующее:

def remove_non_ascii(text):
    non_ascii = 0
    for c in text:
        if not 0 <= ord(c) <= 127:
            non_ascii = non_ascii + 1

    if non_ascii > 0:  # check if there are any non_ascii characters
        print("invalid")
    else:
        print("valid")

Поскольку ascii_letter не использовался, я удалил его.

0 голосов
/ 03 января 2019

Ваш код в настоящее время исключает только те строки, которые полностью состоят из символов, отличных от ASCII. Однако все показанные вами примеры строк содержат символ подчеркивания, который является символом ASCII и поэтому делает имя действительным в соответствии с вашим текущим кодом.

Если это не тот результат, который вам нужен, вам нужно изменить, как работает ваш код. Например, вы можете отклонить любую строку с любыми не-ASCII символами (а не только теми, которые все не-ASCII). Просто измените if len(text) == non_ascii на if non_ascii > 0.

Но я бы предупредил вас, что исключение всех строк с не-ASCII-символами может быть плохой идеей. Многие англоязычные слова (например, café) и имена (например, Zoë) содержат символы не ASCII (по крайней мере, в некоторых написаниях). Может быть, лучше поддержать в вашей программе названия, отличные от ASCII, и исправить любые другие проблемы, которые они вызывают в других местах (например, путем правильного кодирования ваших входов и выходов). Если заголовки не ASCII нежелательны по другим причинам (например, они описывают вещи, которые не на английском языке), то вам следует отфильтровать их по этому другому критерию (например, по языку содержимого), а не по видам букв в заголовке. .

0 голосов
/ 03 января 2019

Pythonic способ сделать это будет декодировать строку как ascii, и поймать UnicodeDecodeError, который будет выброшен, когда есть не-ASCII символы.

try:
    text.decode('ascii')
    print('valid')
except UnicodeDecodeError:
    print('Invalid')

Примечание

Если вы используете Python 3.7, есть функция isascii(), которая проверяет, содержит ли строка все символы ascii.

if text.isascii():
    print('valid')
else:
    print('invalid')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...