【问题标题】:Verify simple human readable urls in Python - validate domain name offline在 Python 中验证简单的人类可读 url - 离线验证域名
【发布时间】:2018-02-15 19:08:23
【问题描述】:

我为此找到了很多问题,但我没有找到实际的答案。

我不需要 httpwww,应该允许用户输入,例如例子.com

允许:

不允许:

  • 示例
  • 1
  • :::::
  • .....

其他问题的问题:

所以我认为我需要正则表达式,就像上面最后一个例子一样,但有点扩展。 https://docs.python.org/3.6/library/re.html

使用此代码,所有示例都可以正常工作,但“example.de/more

def verify_url(self, url):
    url = url.strip()
    if url[-1] == ".":
        url = url[:-1]
    if url[-1] == "/":
        url = url[:-1]
    url = url.replace("https://", "") 
    url = url.replace("http://", "") 
    if url.startswith("www."):
        url = url.replace("www.", "")
    result = re.match(
        "^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$",
        url)
    if result:
        return url

【问题讨论】:

  • 根据您所做的所有研究向我们展示您的尝试。
  • 不要尝试这样做。你永远不会做对,你只会惹恼你的用户。
  • “我想我需要正则表达式” 记住那句老话......
  • example 是一个有效的主机名
  • urlparse 用于解析 URL,因此得名。不适用于验证主机名(同样,您不应该这样做)

标签: python


【解决方案1】:

看来你还没有尝试过! 看下面的例子:

import re
match_cases = ['http://www.example.de', 'https://example.de/more', 'www.sub.example.de', 'example.de']

URL_REGEX = r"""(?i)\b((?:https?:(?:/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?:de|com)/)(?:[^\s()<>{}\[\]]+|\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\))+(?:\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])|(?:(?<!@)[a-z0-9]+(?:[.\-][a-z0-9]+)*[.](?:de|com)\b/?(?!@)))"""


for text in match_cases:
    url = re.findall(URL_REGEX, text)
    print(url)

更多详情请参考以下链接:

Liberal Regex Pattern for Web URLs 和几个类似的答案: https://stackoverflow.com/a/44645567/7664524

https://stackoverflow.com/a/44645124/7664524


更新

在您更新的问题中,您使用了url.replace("https://", "");这将替换 url 中的每个 https://,这意味着包含指向其他 url 的引用链接的一些 url 也将被操纵。

【讨论】:

  • 谢谢,差不多完美了,但这只是接受de或com,如何彻底解除这个限制呢?或者例如只允许 2-5 个字符。
  • r"""(?i)\b((?:https?:(?:/{1,3}|[a-z0-9%])|[a-z0- 9.\-]+[.](?:[a-z0-9]{2,5}|.)/)(?:[^\s(){}[]]+|([^ \s()]*?([^\s()]+)[^\s()]*?)|([^\s]+?))+(?:([^\s()] *?([^\s()]+)[^\s()]*?)|([^\s]+?)|[^\s`!()[]{};:'"。 ,?«»“”''])|(?:(?
  • 查看正则表达式部分:(?:de|com)/) 在这里您可以包含您想要包含的域的所有可能的后缀,但是如果您使用 \s 尝试它,它将接受任何字符串,这将导致接受任何.aaa .aas 之类的域,字面意思是任何东西;我为您提供的链接包含您可能希望包含在代码中的所有域列表(后缀)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2016-05-22
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多