一尘不染

如何检查Python Unicode字符串是否包含非西方字母?

django

我有一个Python Unicode字符串。我想确保它只包含罗马字母(A到Z)的字母,以及欧洲字母中常见的字母,例如ß,ü,ø,é,à和î。它应该不包含其他字母(中国,日本,韩语,阿拉伯语,俄语,希伯来语等)的字符。最好的方法是什么?

目前,我正在使用这段代码,但是我不知道这是否是最好的方法:

def only_roman_chars(s):
    try:
        s.encode("iso-8859-1")
        return True
    except UnicodeDecodeError:
        return False

(我正在使用Python 2.5。我也在Django中执行此操作,因此,如果Django框架碰巧具有处理此类字符串的方式,则可以使用该功能-但是,我还没有遇到过类似的事情。)


阅读 382

收藏
2020-03-29

共1个答案

一尘不染

import unicodedata as ud

latin_letters= {}

def is_latin(uchr):
    try: return latin_letters[uchr]
    except KeyError:
         return latin_letters.setdefault(uchr, 'LATIN' in ud.name(uchr))

def only_roman_chars(unistr):
    return all(is_latin(uchr)
           for uchr in unistr
           if uchr.isalpha()) # isalpha suggested by John Machin

>>> only_roman_chars(u"ελληνικά means greek")
False
>>> only_roman_chars(u"frappé")
True
>>> only_roman_chars(u"hôtel lœwe")
True
>>> only_roman_chars(u"123 ångstrom ð áß")
True
>>> only_roman_chars(u"russian: гага")
False
2020-03-29