【发布时间】:2019-09-12 18:53:21
【问题描述】:
我正在尝试验证文本中包含的 URL 地址。此 URL 应具有以下结构。
<http<s>://>www<.sub-domain*>.domain-name.TLD<.ccTLD><:port-number></>
其中 表示可选,* 表示零个或多个。
如图所示,解析器应该接受以下内容。
- http 或 https,它们都是可选的。
- 必须接受 www。
- 接受零个或多个子域
- 必须接受域名。
- 接受顶级域 (TLD) 和国家代码 TLD(如果存在)。
- 接受端口号(如果可用)。
- 接受结束反斜杠 (/) 如果它在那里。
输出应该是地址(如果它被接受)或 False。
这是python3.7中写的代码。
import re
s=['https://www.yahoo.com/news/apple-iphone/',
'jzd https://www.google.edu sdfklg','sdj http://google.com jkdf',
'https://web.vortex.data.m','sjdfn www.google.com.au','www.google.com/','https://img-s-msn-com.akamaized.net:443',
'http://www.msn.com:80','google.com','(www.google.co.in)']
pattern=r'((http(s)?:\/\/)?www\.)[a-z0-9]+([\-\.][a-z0-9]+)*\.(com?|edu|gov|int|net|org|biz|info)(\.[a-z]{2})?(:[0-9]{1,5})?(\/)?'
def match_URL(pat,line):
try:
return re.search(pat,line).group()
except:
return False
for i in range(len(s):
print(i,"- ",s[i]," --> ",match_URL(pattern,s[i]))
s中列出的地址的预期结果是:
0-https://www.yahoo.com/news/apple-iphone/失败
1- jzdhttps://www.google.edusdfklg 通行证
2- sdj http://google.comjkdf 失败
3- https://web.vortex.data.m 失败
4- sjdfn www.google.com.au 通行证
5- www.google.com/通行证
6- https://img-s-msn-com.akamaized.net:443 失败
8- google.com 失败
9- (www.google.co.in) 通行证
这是结果。
0 - https://www.yahoo.com/news/apple-iphone/ --> https://www.yahoo.com/
1 - jzd https://www.google.edu sdfklg --> https://www.google.edu
2 - sdj http://google.com jkdf --> False
3 - https://web.vortex.data.m --> False
4 - sjdfn www.google.com.au --> www.google.com.au
5 - www.google.com/ --> www.google.com/
6 - https://img-s-msn-com.akamaized.net:443 --> False
7 - http://www.msn.com:80 --> http://www.msn.com:80
8 - google.com --> False
9 - (www.google.co.in) --> www.google.co.in
所有结果都是预期的,除非解析器应该返回“False”,因为匹配模式不应该接受域之后的路径。
我的问题:什么可以添加到不接受在最后一个反斜杠之后具有路径的 URL 的匹配模式中?
【问题讨论】:
-
您应该考虑将
s的值放入一个垂直列表并评论通过/失败。现在真的很难说出你对正则表达式的期望。
标签: python regex python-3.x