【问题标题】:Validate name using Python regex使用 Python 正则表达式验证名称
【发布时间】:2017-12-19 06:28:56
【问题描述】:

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

  1. 大写或小写字符
  2. 没有数字或特殊字符
  3. 可以是一个或两个单词,中间有一个空格
  4. 名字和姓氏可以分别在 2-25 个字符之间

例如。

  • John Smith = 真
  • John = 真
  • JoHn = 真
  • John Sm1th = 假
  • John $mith = 假
  • J0hn = 假
  • 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")   

【问题讨论】:

  • 首先,测试字符串不要使用re.findall,而是re.match
  • 不要让我们猜测哪些测试用例失败了。这应该是您问题的一部分!
  • @DanFarrell 为每个测试用例提供通过/失败

标签: python regex python-3.x


【解决方案1】:

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

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(re.fullmatch('[A-Za-z]{2,25}( [A-Za-z]{2,25})?', x)) for x in lst]
# [True, True, True, False, False, False, False]

【讨论】:

  • 这里[A-Za-z]可以简写为[A-z]
  • @albert:不,这是错误的,查看 ascii 表以查看 A 和 z 之间的所有字符。但是,您可以将 [a-z]re.I 标志一起使用。
  • @albert 你实际上不能,见this answer
  • 正则表达式 " " 和 "\s" 之间有什么实际区别吗?
  • @WoodyPride \s 可以匹配普通空白,制表符\t 和换行符\n\r 在windows 上,而" " 只匹配普通空白。
【解决方案2】:

'[A-Za-z]{2,25}||\s[A-Za-z]{2,25}' 这应该可以。您可以在以下位置测试您的正则表达式 https://pythex.org/

【讨论】: