一个合法的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/2016 ,https://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”,结果中间不用空格。
参考代码:(来自@请叫我问哥)(不知为何只得了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_!~*'().;?:@&=+$,%#-]+)+/?)")
可以使用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。