提高正则表达式的准确性/简洁性以防止不一致的URL过滤

时间:2017-02-17 18:07:49

标签: python regex

所以,对于一些lulz,一个朋友和我正在玩过滤列表(100k +)的网址以仅检索父域(例如" domain.com | org | etc" )。唯一需要注意的是,它们并不是很好并且格式匹配。

所以,要解释一下,有些可能是" http://www.domain.com/urlstuff",有些国家/地区代码类似于" www.domain.co.uk/urlstuff" ;,而其他人可以有点奇怪,更像是" hello.in.con.sistent.urls.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

查找第一个" /"在网址的末尾,然后返回两个"。"在它之前分开的字段。

所以,我的查询,堆栈蜂巢中的任何人都有任何智慧可以解决如何使用更好/更短的正则表达式,或者不依赖于正向查找&#34的正则表达式。 ; /"在字符串中?

赞赏所有这方面的帮助!

2 个答案:

答案 0 :(得分:1)

我认为正则表达式是这个的正确工具。正则表达式是模式匹配,当你有一个可能有多种变体的已知模式时,它会得到最好的使用,就像在这种情况下一样。

在您对该问题的解释和尝试解决方案中,我认为您大大过度简化了它。 TLD比“2位数国家代码”和“3位数”其他代码更多。有关当前可用的数百种信息,请参阅ICANN's list of top-level domains,长度为2位数及以上。此外,您可能拥有没有任何斜杠的URL,以及一些在域名后面有多个斜杠和点的URL。

所以这是我的解决方案(see on regex101):

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

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

故障:

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

答案 1 :(得分:0)

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

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

请注意,这只能在没有'http://'的情况下使用。