如何在python中删除国际字母数字字符?

时间:2019-01-03 02:01:53

标签: python data-science data-cleaning

我已经按照以下步骤在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 :(得分:2)

您的错误在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,因此将其删除。

答案 1 :(得分:2)

您的代码当前仅排除完全由非ASCII字符组成的字符串。但是,您显示的所有示例字符串都包含下划线字符(这是ASCII字符),因此根据当前代码使名称有效。

如果这不是您想要的结果,则需要更改代码的工作方式。例如,您可以拒绝带有 any 非ASCII字符的任何字符串(而不是仅包含 all 非ASCII的那些字符串)。只需将if len(text) == non_ascii更改为if non_ascii > 0

但是我要提醒您,排除所有非ASCII字符的字符串可能不是一个好主意。许多英语单词(例如café)和名称(例如Zoë)包含非ASCII字符(至少在某些拼写中)。最好在程序中支持非ASCII标题,并解决它们在其他地方引起的任何其他问题(例如,通过正确编码输入和输出)。如果非ASCII标题由于其他原因而不受欢迎(例如,它们描述的不是英语),则应根据其他标准(例如,内容的语言)过滤掉它们,而不是标题中的字母种类

答案 2 :(得分:1)

执行此操作的Python方法是将字符串解码为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')