验证Unicode名称

时间:2009-03-09 15:30:47

标签: python unicode validation character-properties

在ASCII中,验证名称并不太难:只需确保所有字符都是按字母顺序排列的。

但是在Unicode(utf-8)中怎么样?如何确保给定字符串中没有逗号或下划线(ASCII范围之外)?

(理想情况下是Python)

5 个答案:

答案 0 :(得分:5)

也许unicodedata module对此任务很有用。特别是category()函数。对于现有的unicode类别,请查看unicode.org。然后,您可以过滤标点字符等。

答案 1 :(得分:5)

只需将bytestring(你的utf-8)转换为unicode对象,并检查所有字符是否都是字母:

s.isalpha()

此方法依赖于语言环境的字符串。

答案 2 :(得分:1)

根据您定义“名称”的方式,您可以根据此正则表达式进行检查:

^\w+$

但是,这将允许数字和下划线。要排除它们,您可以针对以下方式进行第二次测试:

[\d_]

并使你的支票在比赛中失败。这两者可以合并如下:

^(?:(?![\d_])\w)+$

但是出于正则表达式的原因,我宁愿做两次单独的检查。

来自the docs

  

\w

     

LOCALEUNICODE标志出现时   未指定,匹配任何   字母数字字符和   下划线;这相当于   设置[a-zA-Z0-9_]。使用LOCALE,它会   匹配集合[0-9_]加上任何东西   字符定义为字母数字   对于当前的语言环境。如果是UNICODE   设置,这将匹配字符   [0-9_]加上被归类为的任何内容   Unicode字符中的字母数字   属性数据库。

答案 3 :(得分:1)

这可能是迈向解决方案的一步:

import unicodedata
EXCEPTIONS= frozenset(u"'.")
CATEGORIES= frozenset( ('Lu', 'Ll', 'Lt', 'Pd', 'Zs') )
# O'Rourke, Franklin D. Roosevelt

def test_unicode_name(unicode_name):
    return all(
      uchar in EXCEPTIONS
        or unicodedata.category(uchar) in CATEGORIES
      for uchar in unicode_name)

>>> test_unicode_name(u"Michael O'Rourke")
True
>>> test_unicode_name(u"Χρήστος Γεωργίου")
True
>>> test_unicode_name(u"Jean-Luc Géraud")
True

添加例外情况,并进一步检查我可能错过的情况。

答案 4 :(得分:0)

letters模块的string属性可以为您提供所需内容。此属性是特定于语言环境的,因此只要您知道传递给您的文本的语言,就可以使用setlocale()并对这些字符进行验证。

http://docs.python.org/library/string.html#module-string

正如您所指出的那样,在一个真正的“unicode”世界中,除非您了解该语言,否则根本无法知道哪些字符是“按字母顺序排列”的。如果您不了解该语言,则可以默认使用ASCII,也可以运行常用语言的语言环境。