3

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

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

(最好在 Python 中)

4

5 回答 5

5

也许unicodedata 模块对这项任务很有用。尤其是category()功能。对于现有的 unicode 类别,请查看unicode.org。然后,您可以过滤标点符号等。

于 2009-03-09T15:39:52.777 回答
5

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

s.isalpha()

对于字节串,此方法依赖于语言环境。

于 2009-03-09T15:46:43.477 回答
1

根据您定义“名称”的方式,您可以对照这个正则表达式检查它:

^\w+$

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

[\d_]

并使您的检查在匹配时失败。这两者可以组合如下:

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

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

文档

\w

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

于 2009-03-09T15:35:53.160 回答
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

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

于 2009-03-09T20:21:06.593 回答
0

模块的letters属性string应该给你你想要的。此属性是特定于语言环境的,因此只要您知道传递给您的文本的语言,就可以使用setlocale()这些字符并对其进行验证。

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

但是,正如您所指出的,在真正的“unicode”世界中,除非您了解语言,否则根本无法知道哪些字符是“字母”。如果您不了解该语言,则可以默认为 ASCII,或者通过语言环境运行常用语言。

于 2009-03-09T15:35:58.137 回答