在Python中验证名称

Pie*_*rre 2 python regex

对于国际化项目,我必须使用Python验证名称(第一个,最后一个)的全局语法.但缺乏unicode类支持确实使事情变得更加困难.

有没有正则表达式/库可以做到这一点?

例子:

必须接受Björn,Anne-Charlotte,توماس,毛或מיק.-Björn,安妮 - 夏洛特,汤姆或这样的条目应该被拒绝.

有没有简单的方法呢?

谢谢.

Mar*_*ers 12

如果指定re.UNICODE标志,Python确实支持正则表达式中的unicode .你可以使用这样的东西:

r'^[^\W_]+(-[^\W_]+)?$'
Run Code Online (Sandbox Code Playgroud)

测试代码:

# -*- coding: utf-8 -*-
import re

names = [
            u'Björn',
            u'Anne-Charlotte',
            u'?????',
            u'?',
            u'???',
            u'-Björn',
            u'Anne--Charlotte',
            u'Tom_',
        ]

for name in names:
    regex = re.compile(r'^[^\W_]+(-[^\W_]+)?$', re.U)
    print u'{0:20} {1}'.format(name, regex.match(name) is not None)
Run Code Online (Sandbox Code Playgroud)

结果:

Björn                True
Anne-Charlotte       True
?????                True
?                    True
???                  True
-Björn               False
Anne--Charlotte      False
Tom_                 False

如果您还想禁止名称中的数字,请在两个位置更改[^\W_][^\W\d_].

  • @Pierre:使用`\ Z`,而不是`$`,否则"Fred \n"将被视为有效.也许你假设输入已经被清理到剥离前导和尾随空格并用一个空格替换所有内部空白空间的程度.Mark建议的`\ d`与`0-9'不一样......你的改变是故意的吗? (2认同)