URL合法性判断python

一个合法的URL是一个由三部分构成的字符串:协议名+域名+[资源位置]+[/],本题中规定协议只能是http或者https;域名是由“.”分隔的2~4段字符串,每个字符串由英文字母、数字或者下划线组成;资源位置是由“/”分隔的若干段字符串组成,表示资源在服务器上存储的位置,每个字符串由英文字母、数字或者下划线组成,最后一段可以是文件名,形式为“字符串.字符串”;末尾可以有“/”。其中资源位置和/都是可选的,协议名和域名是必须的。

根据这一规则,下面这些都是合法的URL:

http://www.mafengwo.cn/http://www.mgtv.com/https://b.faloo.com/https://dgss0.bdstatic.com/5bVSsj_p_tVS5dKfpU_Y_D3/data/42634b577586fc45fb1e205c2a12ced0
https://dgss0.bdstatic.com/5eR1dDebRNRTm2_p8IuM_a/res/r/image/2016https://s.click.taobao.com/M3SR8gu/index.html
https://s.click.taobao.com/M3SR8gu/homepage.htm/

下面这些都是非法的URL:(!!有些实际上好像是合法的,但是要按题目意思来!!)

http://www.mafengwo.cn/. , http://www@mgtv.com, https://b.faloo.com.cn.jp,
https:/dgss0.bdstatic.com , ftp://s.click.taobao.com/ , https//s.click.taobao.com/

请编程判断给定的字符串是否是形式上合法的域名。

题目中先给出一个整型数n(1 ≤ n ≤ 30),表示后面有n行字符串需要判断。随后的n行中,每行一个字符串,需要进行合法性判断。对于合法的字符串,应输出“Y”,否则输出“N”,结果中间不用空格。

img

参考代码:(来自@请叫我问哥)(不知为何只得了80分,求捉虫)

import re
N = int(input())
check_url = []
for _ in range(N):
    url = input()
    res = re.findall(r'https?://[\w_]+(?:\.[\w_]+){2,3}(?:/[\w_]+)*(?:\.[\w_]+)?/?', url)
    if res and res[0] == url:
        check_url.append('Y')
    else:
        check_url.append('N')
for i in check_url:
    print(i,end='')

仅供参考:

RegExp("^((https|http|ftp|rtsp|mms)?://)?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z].[a-z]{2,6})(:[0-9]{1,4})?((/?)|(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)")

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7517490
  • 以下回答由chatgpt基于相关博客总结生成:

    可以使用Python中的正则表达式模块re来判断URL是否合法。合法的URL应该满足以下条件: 1. 以http或https开头; 2. 域名部分必须包含"."; 3. 域名部分必须以".com"或".cn"结尾; 4. 如有其他请求参数,需加以正确处理。

    参考代码如下:

    import re
    
    def is_valid_url(url):
        """
        判断url是否合法
        :param url: 待判断的字符串
        :return: 字符串Y或N,表示该URL是否合法
        """
        pattern = re.compile(r'^https?://[\w\-\.]+(\.[a-z]{2,3})(:[0-9]{1,5})?(/[\w\-/\.]*)?$')
        # 定义匹配正则表达式,包括http和https、域名、端口号和请求路径
        if pattern.match(url):
            return "Y"
        else:
            return "N"
    

    该函数首先定义了一个正则表达式,然后调用pattern.match方法进行匹配。如果匹配成功,返回字符串"Y",否则返回字符串"N"。

    需要注意的是,在处理url时,有些请求可能会带有其他参数,如:https://weibo.com/ajax/profile/info?uid=1669879400。此时,我们只需要取出uid这一参数进行判断即可。

    参考代码如下:

    def get_uid_from_url(url):
        """
        从url中获取uid参数值
        :param url: 待分析的字符串
        :return: uid参数值
        """
        pattern = re.compile(r"uid=(\d+)")
        result = pattern.findall(url)
        if result:
            return result[0]
        else:
            return None
    

    该函数定义了一个匹配uid参数值的正则表达式,然后通过pattern.findall方法进行匹配,并返回匹配结果。如果未匹配成功,返回None。