【问题标题】:Validate single dot and space in regex验证正则表达式中的单个点和空格
【发布时间】:2019-03-16 15:47:56
【问题描述】:

我正在尝试在以下条件下验证名称

  1. 第一个和最后一个字符应该是字母,并且前后不能有空格。
  2. 如果有任何点,那么应该有一个空格。名称最多可以包含 1 个点和 1 个空格。
  3. 字长应为 5,20。

代码工作:

    def check(word):
        matchObj = re.match( r'^(([^ ]?)(^[a-zA-Z]).*([a-zA-Z]$)([^ ]?))$', word, re.M|re.I)
        if matchObj:
            return True
        else:
            return False

我能够做到第 1 点,但无法理解如何做到第 2 点。对于第三点,我在正则表达式的最后一个 $ 之前尝试了 {5,20},但它不起作用。

从上面的正则表达式我想验证 - 杰克逊 - 杰克逊博士

并使以下内容无效: - Jackson 博士 # 点后两个空格 (.) - Dr.Jackson # 包含两个点

希望您能解决我的问题。

【问题讨论】:

  • 为什么不将len 用于#3?

标签: python regex python-3.x


【解决方案1】:

您可以将此正则表达式与前瞻断言一起使用:

(?mi)^[a-z](?!(?:.*\.){2})(?!(?:.* ){2})(?!.*\.[a-z])[a-z. ]{3,18}[a-z]$

RegEx Demo

正则表达式详细信息:

  • (?mi):启用 MULTILINE 和 IGNORE_CASE 模式
  • ^:开始
  • [a-z]:匹配开头的字母
  • (?!(?:.*\.){2}):否定前瞻断言我们没有超过一个点
  • (?!(?:.* ){2}): Negative Lookahead 断言我们没有超过一个空格
  • (?!.*\.[a-z]): Negative Lookahead 断言如果我们有一个点,那么它后面不跟一个字母
  • [a-z. ]{3,18}: 匹配 3 到 18 个给定字符使总长度为 5 到 20
  • [a-z]: 匹配结束前的一个字母
  • $:结束

【讨论】:

  • 您能否解释一下您的答案,以便将来我会记住这些提示。
  • {3,18} 如何将长度设为 5 到 20。据我所知,它将检查从 3 到 18 的长度。包括长度 = 3 和长度 = 18。
  • in (?!(?:.*\.){2}) {2} 是什么意思?
  • {3,18} 是在开头匹配一个字母和结尾匹配一个字母之后,所以总共变成{5,20}。此外,(?:.*\.){2} 匹配任意数量的字符,后跟点,该点位于由{2} 量化的非捕获组中,使其匹配任意位置的 2 个点
  • 对于不包含 ASCI 字符的名称(如 Prof.于尔根。恕我直言,使用 \w+ 而不是 [a-z]UNICODE 标志会是更好的选择。
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2014-01-28
相关资源
最近更新 更多