如何检查Python Unicode字符串是否包含非西方字母?
我有一个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
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。