使用Python regex验证名称

时间:2017-12-18 22:09:10

标签: python regex python-3.x

如果名称有效,我想返回true。名称可以包含:

  1. 大写或小写字符
  2. 没有数字或特殊字符
  3. 可以是一个或两个单词,中间有一个空格
  4. 名字和姓氏各占2-25个字符
  5. 例如。

    • John Smith = true
    • John = true
    • JoHn = true
    • John Sm1th = false
    • John $mith = false
    • J0hn = false
    • John Smith = false(名称之间有两个空格)

    到目前为止,这是我的代码。它失败了一些测试用例。

    import re
    
    if re.findall('[A-Za-z]{2,25}\s[A-Za-z]{2,25}', string):
        print("true")
    else:
        print("false")   
    

2 个答案:

答案 0 :(得分:4)

要匹配一个或两个单词,您需要将名字或姓氏设为可选,您还需要锚点以确保它不是部分匹配或使用re.fullmatch而不是re.findall:< / p>

lst = ['John Smith', 'John', 'JoHn', 'John Sm1th', 'John $mith', 'J0hn', 'John  Smith']

import re
[re.fullmatch('[A-Za-z]{2,25}( [A-Za-z]{2,25})?', x) for x in lst]
# [<_sre.SRE_Match object; span=(0, 10), match='John Smith'>, <_sre.SRE_Match object; span=(0, 4), match='John'>, <_sre.SRE_Match object; span=(0, 4), match='JoHn'>, None, None, None, None]

将结果转换为bool:

[bool(re.fullmatch('[A-Za-z]{2,25}( [A-Za-z]{2,25})?', x)) for x in lst]
# [True, True, True, False, False, False, False]

答案 1 :(得分:0)

'[A-Za-z]{2,25}||\s[A-Za-z]{2,25}'这应该有效。你可以在那里测试你的正则表达式 the documentation