Python |如何改进验证名称的正则表达式?

Python | How to improve my regex which validates names?

我有一个 Python 正则表达式,用于验证用户在聊天机器人中给出的名称。

(?=.{2,100}$)[^\W\d_]{2,}(?:[-\s][^\W\d_]{2,})*

正如您在 demo 中看到的那样,它工作得很好,但对于以下输入我仍然有问题:

如您所见,我希望我的正则表达式匹配,即使用户键入他的名字时带有标点符号。 你会如何改进正则表达式?

要增强当前模式,您可以将 {2,} 限制量词替换为 + 以允许单个字符前缀,例如 O'd' 并添加一个可选的 [.?!]?最后的模式:

^(?=.{2,100}$)[^\W\d_]+(?:[-' ][^\W\d_]+)*[.?!]?$

参见regex demo。您可以在名称末尾添加更多您希望允许的标点字符到字符 class 中(记得转义 ^]-\ 在方括号内)。

详情:

  • ^ - 字符串开头
  • (?=.{2,100}$) - 字符串中必须有 2 到 100 个字符
  • [^\W\d_]+ - 一个或多个字母
  • (?:[-' ][^\W\d_]+)* - space、'- 后跟一个或多个字母
  • 出现零次或多次
  • [.?!]? - 可选的 ?!.
  • $ - 字符串结尾。