【问题标题】:Python regular expression grouping?Python正则表达式分组?
【发布时间】:2015-01-17 21:51:44
【问题描述】:

我一直在尝试寻找代码来匹配项目电子邮件中的正则表达式。这些是要求:

电子邮件必须采用 acct@domain 格式

  • acct 为 1 个或多个字符,并且仅由大小写字母字符、数字字符、破折号、句点、下划线和连字符组成
  • acct 不能以下划线、破折号、句点或连字符开头或结尾。每个句号前后必须至少有两个字母。
  • 域为 5 个或更多字符,并且仅由大写或小写字母字符、数字字符、破折号、句点和连字符、下划线组成
  • 域必须至少有一个句点,并且不能以下划线、破折号、句点或连字符开头或结尾。每个句号前后必须至少有两个字母。
  • 我已经用代码弄清楚了acct部分:

    if re.search("^[a-zA-z0-9]+[a-zA-z0-9-_]*$|^[a-zA-z0-9]+[a-zA-z0-9-_]+[\.]{1}[a-zA-z0-9]{2,}$", email):
        print "valid!"
    

    还有域名:

    if re.search("^[a-zA-z0-9]+[a-zA-z0-9-_]+[\.]{1}[a-zA-z0-9]{2,}$", email):
        print "valid!"
    

    我的问题是我无法弄清楚如何将它们组合在一起并放置@符号

    我尝试了以下方法,但似乎不起作用。

    if re.search("(^[a-zA-z0-9]+[a-zA-z0-9-_]*$|^[a-zA-z0-9]+[a-zA-z0-9-_]+[\.]{1}[a-zA-z0-9]{2,}$)@(^[a-zA-z0-9]+[a-zA-z0-9-_]+[\.]{1}[a-zA-z0-9]{2,}$)", email):<br>
        print "valid!
    

    "

    它不起作用!我无法让它永远匹配。如果您有使代码不那么笨拙的建议,请告诉我!

    【问题讨论】:

    • 这些要求从何而来?他们很古怪。拥有像u.thant@un.example.org 这样的电子邮件地址是相当普遍的,因为有些人的名字是一个字母。
    • 另外,{1} 量词完全是多余的,字符类中的反斜杠与文字反斜杠匹配。您只需要\.[.]
    • 您只允许在帐户名或域部分中使用一个句点。您的要求意味着允许多个句点,只要它们之间有多个字母数字字符。这有点难以组合——您可以使用前瞻断言来组合多个重叠约束,但这会使正则表达式显着复杂化。鉴于需求似乎是凭空提出的,我不确定是否值得付出努力。但您当然可以在此网站上找到数百个类似问题的示例来学习。
    • 你在所有字符类中有错字A-z必须是A-Z
    • @tripleee 它是一个非常简单的初学者 python 类,要求有点偏,但感谢您的洞察力!!

    标签: python regex grouping email-validation


    【解决方案1】:

    使用non-capturing group 组合两个正则表达式。

    if re.search(r"^(?:[a-zA-Z0-9]+[a-zA-Z0-9-]*|[a-zA-Z0-9]+[a-zA-Z0-9-]+[.][a-zA-Z0-9]{2,})@[a-zA-Z0-9]+[a-zA-Z0-9-_]+[.][a-zA-Z0-9]{2,}$", email):
        print "valid"
    

    DEMO

    正则表达式:

    ^                        the beginning of the string
    (?:                      group, but do not capture:
      [a-zA-Z0-9]+             any character of: 'a' to 'z', 'A' to
                               'Z', '0' to '9' (1 or more times)
      [a-zA-Z0-9-]*            any character of: 'a' to 'z', 'A' to
                               'Z', '0' to '9', '-' (0 or more times)
     |                        OR
      [a-zA-Z0-9]+             any character of: 'a' to 'z', 'A' to
                               'Z', '0' to '9' (1 or more times)
      [a-zA-Z0-9-]+            any character of: 'a' to 'z', 'A' to
                               'Z', '0' to '9', '-' (1 or more times)
      [.]                      any character of: '.'
      [a-zA-Z0-9]{2,}          any character of: 'a' to 'z', 'A' to
                               'Z', '0' to '9' (at least 2 times)
    )                        end of grouping
    @                        '@'
    [a-zA-Z0-9]+             any character of: 'a' to 'z', 'A' to 'Z',
                             '0' to '9' (1 or more times)
    [a-zA-Z0-9-_]+           any character of: 'a' to 'z', 'A' to 'Z',
                             '0' to '9', '-', '_' (1 or more times)
    [.]                      any character of: '.'
    [a-zA-Z0-9]{2,}          any character of: 'a' to 'z', 'A' to 'Z',
                             '0' to '9' (at least 2 times)
    $                        before an optional \n, and the end of the
                             string
    

    【讨论】:

      【解决方案2】:

      从两个组中去掉anchors,并将其应用到整个组中

      if re.search(r"^(?:[a-zA-Z0-9]+[a-zA-Z0-9-]*|[a-zA-Z0-9]+[a-zA-Z0-9-]+\.[a-zA-Z0-9]{2,})@[a-zA-Z0-9]+[-\w]+\.[a-zA-Z0-9]{2,}$", email):
          print "valid!"
      

      所做的更改

      • 锚点^$ 应用于整个正则表达式

      • [\.]{1} 可以简化为 \.,因为它只匹配 一个 出现的 .

      • [a-zA-z0-9-_]可以简化为[-\w]

      【讨论】:

      • @Jay r 使字符串为原始字符串,它将处理正则表达式中的反斜杠
      【解决方案3】:

      以下是可以验证所有标准的正则表达式,我希望它也更有效。

      ^(?![\W_])((?:([\w-]{2,})\.?){1,})(?<![\W_])@(?![\W_])(?=[\w.-]{5,})(?=.+\..+)((?:([\w-]{2,})\.?){1,})(?<![\W_])$
      

      这里是regex demo

      【讨论】:

        猜你喜欢
        • 2019-01-25
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多