所以,对于一些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的正则表达式。 ; /"在字符串中?
赞赏所有这方面的帮助!
答案 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://'
的情况下使用。