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、'
或 -
后跟一个或多个字母 出现零次或多次
[.?!]?
- 可选的 ?
、!
、.
$
- 字符串结尾。
我有一个 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、'
或-
后跟一个或多个字母 出现零次或多次
[.?!]?
- 可选的?
、!
、.
$
- 字符串结尾。