【问题标题】:Valid domain name regex有效的域名正则表达式
【发布时间】:2013-10-31 11:15:38
【问题描述】:

应该如何是有效的域名正则表达式,它完全满足以下条件。

  1. 每个标签最多 63 个字符,最少 1 个字符
  2. 包含数字、字母和'-',但是
  3. 不应以'-'开头和结尾
  4. 域名最大长度 255 个字符,最少 1 个。

例如

一些有效的组合:

a
a.com
aa-bb.b

我创建了这个^(([a-z0-9]){1,63}\.?){1,255}$

但目前它没有按要求验证“-”部分(它是,缺失)

有什么办法吗?

如果我错了,请纠正我。

【问题讨论】:

  • 使用 urlparse!正则表达式并不是万能的。

标签: python regex


【解决方案1】:

并且必须以“.”结尾: 在这里我找到了解决方案

"^(((([A-Za-z0-9]+){1,63}\.)|(([A-Za-z0-9]+(\-)+[A-Za-z0-9]+){1,63}\.))+){1,255}$"

【讨论】:

  • 它不必以句点结尾。介意解释吗?句点通常出现在域的最后 2-4 个字符中,在域扩展之前。
  • 是的,结尾有句号是可选的。需要相应改进。
【解决方案2】:

此表达式应满足所有要求: ^(?=.{1,255}$)(?!-)[A-Za-z0-9\-]{1,63}(\.[A-Za-z0-9\-]{1,63})*\.?(?<!-)$

  • 对总字符长度使用前瞻
  • 域可以选择以. 结尾

【讨论】:

    【解决方案3】:

    也许是这样的:

    ^(([a-zA-Z0-9\-]{1,63}\.?)+(\-[a-zA-Z0-9]+)){1,255}$
    

    【讨论】:

      【解决方案4】:

      不要重新发明*。您可以使用库,例如验证器。或者你可以复制their code

      安装

      pip install validators
      

      用法

      import validators
      if validators.domain('example.com')
          print('this domain is valid')
      

      万一您发现错误,您可以修复并报告错误。

      【讨论】:

        【解决方案5】:

        不要使用正则表达式,而是尝试查看urlparse

        https://docs.python.org/3/library/urllib.parse.html

        它学习起来相当简单,而且使用起来更好、更舒适。

        【讨论】:

        • 链接已损坏。
        【解决方案6】:

        使用 | RE 中的运算符后跟 '-'.. 确保使用 \

        转义文字 '-'

        【讨论】:

          【解决方案7】:

          不要使用正则表达式解析域名,使用urllib.parse

          如果您需要在 HTML 中查找有效域名,则使用正则表达式 [ &lt;&gt;] 拆分页面文本,然后使用 urllib.parse 解析每个结果字符串。

          【讨论】:

          • urllib.parse 无法确保域名有效。 netloc 可能包含“localhost”或格式错误的 url 的误报(例如“example”、“malformed”)
          【解决方案8】:

          试试这个:

          ^(([a-z0-9]\-*[a-z0-9]*){1,63}\.?){1,255}$
          

          【讨论】:

            最近更新 更多