【问题标题】:Validate the website URL address doesn't have path using python regular expression使用 python 正则表达式验证网站 URL 地址没有路径
【发布时间】:2019-09-12 18:53:21
【问题描述】:

我正在尝试验证文本中包含的 URL 地址。此 URL 应具有以下结构。

<http<s>://>www<.sub-domain*>.domain-name.TLD<.ccTLD><:port-number></>

其中 表示可选,* 表示零个或多个。

如图所示,解析器应该接受以下内容。

  1. http 或 https,它们都是可选的。
  2. 必须接受 www。
  3. 接受零个或多个子域
  4. 必须接受域名。
  5. 接受顶级域 (TLD) 和国家代码 TLD(如果存在)。
  6. 接受端口号(如果可用)。
  7. 接受结束反斜杠 (/) 如果它在那里。

输出应该是地址(如果它被接受)或 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 失败

7-http://www.msn.com:80通过

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


【解决方案1】:

不用发疯并尝试validate all TLDs 或端口号,那么这样的事情就可以了:

(https?:\/\/)?                # optionally start with http(s)://
(?:[a-z]+(?:-+[a-z]+)*\.){2,} # require 2 or more instances of chars and dashes followed by a period
[a-z]+                        # TLD check
(:\d+)?                       # optional port number
\/?                           # optional traling slash

https://regex101.com/r/OUxQvj/4

【讨论】:

  • 它仍然没有完全解决我的所有实例。例如,提供的正则表达式模式不应接受第一个示例。此外,第二个形式的结尾被接受,它不应该。
  • @aneesal-najjar 请参阅我对您原始问题的澄清评论请求。在您提供这些信息后,我会考虑更新我的正则表达式。
【解决方案2】:

代码与 OP 的代码非常相似,只是做了一些简化。首先,正则表达式以(?i) 开头,以使搜索不区分大小写。其次,也是最重要的,正则表达式有一个终止的否定前瞻(?!(\/|\w)),它表示正则表达式的前一部分应该只在 if 后面没有 / 或单词字符时匹配。

如果你只想要域名,比如www.yahoo.com,那么:

return re.search(pat,line.group(2))

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'(?i)((?:https?:\/\/)?(www(\.[a-z0-9\-]+)*\.(com?|edu|gov|int|net|org|biz|info)(\.[a-z]{2})?)(?::[0-9]{1,5})?(\/)?)(?!(\/|\w))'

def match_URL(pat,line):
    try:
        return re.search(pat,line).group()
    except:
        return False

for i in s:
    print(i," --> ",match_URL(pattern,i))

打印:

https://www.yahoo.com/news/apple-iphone/  -->  False
jzd https://www.google.edu sdfklg  -->  https://www.google.edu
sdj http://google.com jkdf  -->  False
https://web.vortex.data.m  -->  False
sjdfn www.google.com.au  -->  www.google.com.au
www.google.com/  -->  www.google.com/
https://img-s-msn-com.akamaized.net:443  -->  False
http://www.msn.com:80  -->  http://www.msn.com:80
google.com  -->  False
(www.google.co.in)  -->  www.google.co.in

See Demo

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2011-07-14
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多