【问题标题】:Regex for names in multiple languages多语言名称的正则表达式
【发布时间】:2020-05-22 08:28:11
【问题描述】:

我希望我的聊天机器人的用户在文本框中写下他的名字。

以下类型都可以:

  • 拉丁字母:John
  • 每个带有非拉丁字符的名称,例如:àaäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇß
  • 德语字母:ä,ü,ö,ß Ä, Ü, Ö
  • 多个名称,例如:Peter-Alexander
  • 没关系,如果用户在他的名字末尾加上一个点:John。

这是不正确的:

  • 马克斯!
  • 最大123
  • 最大 123
  • 最大_
  • 最大!"§$%&/()

这是我尝试过的:

import re

value='John'

if not re.search(r'\d', value) and not re.search(r"[^a-zA-Z.\-\sÜüßäÄöÖ]", value) and not re.search(r"[.-]\Z", value):
  print('name is correct')
else:
  print('name is not correct')

【问题讨论】:

  • MaxJohn 有何不同?您还想在最后允许-,对吗?不只是.John-Pete-Alexander 是否允许?
  • 对不起,我的失误。当然,麦克斯和约翰没有区别。我删除了它!是的,约翰-皮特-亚历山大很好!我的计划实际上是只允许在名称末尾添加一个点 .。但是,如果您认为应该允许使用像 !? 这样的其他标志,我可以接受
  • 好的,看我的回答。你可以在最终的字符类中添加你需要的?![!?.-]?

标签: regex encoding character


【解决方案1】:

我建议使用

re.search(r'^[^\W\d_]+(?:-[^\W\d_]+)*\.?$', text)

请参阅regex demo。如果您最后还允许-,请使用

re.search(r'^[^\W\d_]+(?:-[^\W\d_]+)*[.-]?$', text)

看到这个regex demo。请注意,您可以使用 re.fullmatch 来确保完整的字符串匹配,然后您不需要锚点:re.fullmatch(r'[^\W\d_]+(?:-[^\W\d_]+)*[.-]?', text)

详情

  • ^ - 字符串开头
  • [^\W\d_]+ - 1+ Unicode 字母
  • (?:-[^\W\d_]+)* - 0 个或多个 - 重复和 1+ 个 Unicode 字母
  • [.-]? - 可选的 -.
  • $ - 字符串结束。

【讨论】:

  • 非常感谢。这看起来很棒。只是一些较小的问题:如果我想接受如下名称的空格:John Hopkins 我应该在哪里放置空格符号\s
  • @PParker (?:-[^\W\d_]+)* => (?:[-\s][^\W\d_]+)*,见demo
  • 最后一个问题:对于像这样的名称,正确的正则表达式是什么:Miky D. Moùse 第二个名称后面有一个点!
  • @PParker 根据您的要求,Miky D. Moùse 无效,因为它包含空格。如果是新问题,请检查之前是否没有被问过,然后发布。也许你可以使用^[^\W\d_](?:\.|[^\W\d_]*)(?:[-\s][^\W\d_](?:\.|[^\W\d_]*))*[.-]?$,但我不确定。
猜你喜欢
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2010-09-21
  • 2011-01-31
  • 2013-04-27
  • 1970-01-01
相关资源
最近更新 更多