在ASCII中,验证名称并不太难:只需确保所有字符都是按字母顺序排列的。
但是在Unicode(utf-8)中怎么样?如何确保给定字符串中没有逗号或下划线(ASCII范围之外)?
(理想情况下是Python)
答案 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
当
LOCALE
和UNICODE
标志出现时 未指定,匹配任何 字母数字字符和 下划线;这相当于 设置[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,也可以运行常用语言的语言环境。