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

40 投票
8 回答
33508 浏览
提问于 2025-04-16 00:17

我有一个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有处理这种字符串的方法,我可以用那个功能,不过我还没遇到过这样的东西。)

8 个回答

4

标准的 string 包里包含了所有的 拉丁 字母、数字符号。你可以把这些内容从文本中去掉,如果剩下的还有东西,那就是非拉丁字符。我就是这么做的:

In [1]: from string import printable                                                                                                                                                                           

In [2]: def is_latin(text): 
   ...:     return not bool(set(text) - set(printable)) 
   ...:                                                                                                                                                                                                        

In [3]: is_latin('Hradec Králové District,,Czech Republic,')                                                                                                                                                   
Out[3]: False

In [4]: is_latin('Hradec Krlov District,,Czech Republic,')                                                                                                                                                     
Out[4]: True

我没有办法检查所有的非拉丁字符,如果有人能做到这一点,请告诉我。谢谢。

37

这个问题的最佳回答来自@tzot,非常不错。不过我觉得应该有一个库,可以适用于所有的脚本。所以,我做了一个(这个库主要是基于那个回答的)。

pip install alphabet-detector

然后可以直接使用它:

from alphabet_detector import AlphabetDetector
ad = AlphabetDetector()

ad.only_alphabet_chars(u"ελληνικά means greek", "LATIN") #False
ad.only_alphabet_chars(u"ελληνικά", "GREEK") #True
ad.only_alphabet_chars(u'سماوي يدور', 'ARABIC')
ad.only_alphabet_chars(u'שלום', 'HEBREW')
ad.only_alphabet_chars(u"frappé", "LATIN") #True
ad.only_alphabet_chars(u"hôtel lœwe 67", "LATIN") #True
ad.only_alphabet_chars(u"det forårsaker første", "LATIN") #True
ad.only_alphabet_chars(u"Cyrillic and кириллический", "LATIN") #False
ad.only_alphabet_chars(u"кириллический", "CYRILLIC") #True

此外,还提供了一些方便的方法,适用于主要语言:

ad.is_cyrillic(u"Поиск") #True  
ad.is_latin(u"howdy") #True
ad.is_cjk(u"hi") #False
ad.is_cjk(u'汉字') #True
49
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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答