我有一个Python Unicode字符串.我想确保它只包含罗马字母表(A到Z)中的字母,以及欧洲字母表中常见的字母,如?、?和?它应该not包含其他字母(中文、日文、韩文、阿拉伯文、西里尔文、希伯来文等)中的字符.做这件事最好的方法是什么?

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

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

(我使用的是Python2.5.我也在Django中这样做,所以如果Django框架碰巧有一种方法来处理这样的字符串,我可以使用该功能--不过,我还没有遇到过类似的情况.)

推荐答案

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

Django相关问答推荐

Django在保存时更新m2m对象

如何在Django上创建ManyToMany管理面板?

管理器不能通过对象上的对象实例访问.保存()

从Azure Web应用服务器上的cron任务的虚拟环境加载变量

SQLite上可以正常使用Many2Many链接注释,但MariaDB上无法正常使用(生产环境)

Django: 无法将我的 comments 关联到特定产品

根据当前对象中的多对多字段过滤对象

使用 Crispy Forms 时 Django 返回 'TemplateDoesNotExist'

Nginx 响应 404 not found on Django media URL in preprod, dev ok

如何在 django 中修改现有模型实例?

Django:想要将一个空字段显示为空白而不是显示无

删除所有实例后,Django 模型实例主键不会重置为 1

Django 模板上的 URL 编码

django类型对象Http404没有属性get

Python:获取异常的错误消息

Django 什么是反向关系?

Django/Python初学者:执行python manage.py syncdb时出错-找不到psycopg2

如何过滤(或替换)在 UTF-8 中占用超过 3 个字节的 unicode 字符?

django 如何知道已经运行了哪些迁移?

ModelForm 上的 Django 和字段集