提高regex对不一致url过滤的准确性/简洁性

2024-10-02 12:27:58 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,对于一些lulz来说,我和一个朋友在玩过滤一个URL列表(100k+)的想法,只检索父域(例如“domain.com | org | etc”)。唯一需要注意的是,它们在格式上并不都是好的和匹配的

所以,为了解释,有些可能是“http://www.domain.com/urlstuff”,有些有国家代码,如www.domain.co.uk/urlstuff,而另一些则可能有点奇怪,更类似于“hello.in.con.consistent.url.com/urlstuff”

所以,撇开故事不谈,我有一个正则表达式:

import re

firsturl = 'www.foobar.com/fizz/buzz'
m = re.search('\w+(?=(\..{3}/|\..{2}\..{2}/))\.(.{3}|.{2}\..{2})', firsturl)

m.group(0)

返回:

foobar.com

它查找url末尾的第一个“/”,然后返回前面两个“.”分隔的字段

那么,我的问题是,堆栈配置单元中的任何人是否有任何智慧来阐述如何使用更好/更短的正则表达式,或者不依赖于字符串中“/”的正向查找的正则表达式来实现这一点

感谢所有在这方面的帮助


Tags: orgrecomurl列表domainwwwetc
2条回答

您可以改用此正则表达式:

import re
firsturl = 'www.foobar.com/fizz/buzz'
domain = re.match("(.+?)\/", firsturl).group()

不过,请注意,这只适用于没有'http://'的情况

我确实认为正则表达式正是适合这种情况的工具。Regex是一种模式匹配,当您有一个已知的模式可能有几个变体时(如本例中所示),它会得到最好的使用

不过,在你对这个问题的解释和试图解决这个问题时,我认为你过于简单化了。TLD比“2位国家代码”和“3位”其他代码有更多的风格。请参阅ICANN's list of top-level domains以获取当前可用的数百个字符,长度从2位以上。另外,你可能有没有任何斜杠和域名后有多个斜杠和点的网址

下面是我的解决方案(see on regex101):

^(?:https?://)?(?:[^/]+\.)*([^/]+\.[a-z]{2,})

在第一个匹配组中捕获您想要的内容

分解:

  • ^(?:https?://)?在开头匹配一个可能的协议
  • (?:[^/]+\.)*匹配可能的多个非斜杠序列,每个序列后跟一个点
  • ([^/]+\.[a-z]{2,})匹配(并捕获)最后一个非斜杠序列,后跟一个点和TLD(2+个字母)

相关问题 更多 >

    热门问题