在 ASCII 中,验证名称并不太难:只要确保所有字符都按字母顺序排列即可。
但是在 Unicode (utf-8) 中呢?如何确保给定字符串中没有逗号或下划线(ASCII 范围之外)?
(最好在 Python 中)
在 ASCII 中,验证名称并不太难:只要确保所有字符都按字母顺序排列即可。
但是在 Unicode (utf-8) 中呢?如何确保给定字符串中没有逗号或下划线(ASCII 范围之外)?
(最好在 Python 中)
也许unicodedata 模块对这项任务很有用。尤其是category()
功能。对于现有的 unicode 类别,请查看unicode.org。然后,您可以过滤标点符号等。
只需将字节串(您的 utf-8)转换为 unicode 对象并检查所有字符是否都是字母:
s.isalpha()
对于字节串,此方法依赖于语言环境。
根据您定义“名称”的方式,您可以对照这个正则表达式检查它:
^\w+$
但是,这将允许数字和下划线。要排除它们,您可以针对以下内容进行第二次测试:
[\d_]
并使您的检查在匹配时失败。这两者可以组合如下:
^(?:(?![\d_])\w)+$
但是出于正则表达式性能的原因,我宁愿做两次单独的检查。
从文档:
\w
未指定
LOCALE
and标志时,匹配任何字母数字字符和下划线;UNICODE
这相当于 set[a-zA-Z0-9_]
。使用LOCALE
,它将匹配集合[0-9_]
加上当前语言环境中定义为字母数字的任何字符。如果UNICODE
设置,这将匹配字符[0-9_]
加上 Unicode 字符属性数据库中分类为字母数字的任何内容。
这可能是迈向解决方案的一步:
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
添加例外,并进一步检查我可能错过的。
模块的letters
属性string
应该给你你想要的。此属性是特定于语言环境的,因此只要您知道传递给您的文本的语言,就可以使用setlocale()
这些字符并对其进行验证。
http://docs.python.org/library/string.html#module-string
但是,正如您所指出的,在真正的“unicode”世界中,除非您了解语言,否则根本无法知道哪些字符是“字母”。如果您不了解该语言,则可以默认为 ASCII,或者通过语言环境运行常用语言。