Regex(Python)计算域名中的元素

Regex(Python)计算域名中的元素,python,regex,Python,Regex,我想解析一个URL并计算其域名中的“元素”数。 例如,如果我有一个urlhttp://news.bbc.co.uk/foo/bar/xyzzy.html,我对第4条(新闻、bbc、co、英国)感兴趣 我总是回避正则表达式,因为它太神秘了。我通常会通过在//和/之间拆分字符串并在其间计算点来实现这一点。这一次,我决定离开我的舒适区,大胆地尝试一些自我改进,并使用正则表达式,计算比赛组的数量 这就是我所尝试的: pattern = r"^.*//(([^./]+\.)+)/.*$" 但这与任何东西

我想解析一个URL并计算其域名中的“元素”数。
例如,如果我有一个url
http://news.bbc.co.uk/foo/bar/xyzzy.html
,我对第4条(新闻、bbc、co、英国)感兴趣

我总是回避正则表达式,因为它太神秘了。我通常会通过在//和/之间拆分字符串并在其间计算点来实现这一点。这一次,我决定离开我的舒适区,大胆地尝试一些自我改进,并使用正则表达式,计算比赛组的数量

这就是我所尝试的:

pattern = r"^.*//(([^./]+\.)+)/.*$"
但这与任何东西都不匹配。我知道在某个地方有个问题,至少在处理域uk/(应该被计算在内,但是应该使用点以外的东西)的最后一部分时是这样的,但是仍然打破了匹配组模式,以便解析进入尾部

我的想法是先消费一切,直到//,包括//。这部分可能有效。然后我会开始匹配组,其中一个组是任何不是的组。或/,重复到一个点,然后消耗该点,直到所有这些组都消耗完毕。这些将是我感兴趣的比赛小组。然后消费/处理剩下的,因为我对它不再感兴趣了。这是错误的


或者,在不合适的地方使用正则表达式是徒劳的吗?

假设输入一致,您可以:

^[^:]+://([^/]+)
  • ^[^:::+
    从开始到第一个匹配一个或多个字符

  • ://
    逐字匹配字符

  • ([^/]+)
    捕获的组包含一个或多个字符,直到下一个
    /

您可以使用上面的代码获得例如
news.bbc.co.uk
,然后只需简单的
str.split('.')

注意:显而易见的一点,不要为此使用正则表达式,请使用适当的URL解析器库(例如
urlparse

示例:

In [49]: s = 'http://news.bbc.co.uk/foo/bar/xyzzy.html'

In [50]: re.search(r'^[^:]+://([^/]+)', s).group(1).split('.')
Out[50]: ['news', 'bbc', 'co', 'uk']

您可以尝试以下正则表达式:

import re
pattern=r'(?:\/\/)(\w+)|(?<=\.)(\w+)'

string='http://news.bbc.co.uk/foo/bar/xyzzy.html'

result=[]
match=re.finditer(pattern,string)
for i in match:
    if i.group(1)!=None:
        result.append(i.group(1))
    elif i.group(2)!=None and i.group(2)!='html':
        result.append(i.group(2))

print(result)
但最酷的是你可以用一句话来做这件事:

import tldextract

result=tldextract.extract("http://news.bbc.co.uk/foo/bar/xyzzy.html")

print([i.split('.') for i in result])
输出:

['news', 'bbc', 'co', 'uk']
[['news'], ['bbc'], ['co', 'uk']]

嗯,是的,是……哦,好吧。。那我的自我提升就来了。
len(s.split('/')[2]。split('.')
你的正则表达式失败了,因为它要求最后一个
uk
也以
结尾。因为你对之前和之后发生的事情不感兴趣,锚是不必要的;您可以使用
(?但是你真的应该使用而不是正则表达式。urlparse绝对是正确的方法。我知道我这样做不是最好的方法,只是试图学习正则表达式以及它们能做什么和不能做什么。@Hannu这是不可能的-至少不能用一个正则表达式。你总是必须先提取域名,然后才可以t点的数量。如果你一定要使用正则表达式,你将需要两个正则表达式:一个用于提取,一个用于计数。@Hannu正则表达式一开始可能看起来很神秘,但一旦你仔细研究了它,它就简单且非常有趣。在HTTP中使用正则表达式完全解析
/
//code>之间的内容并非不可能或者HTTPS URL,但有几个复杂性使得正则表达式不是特别合适。您需要处理
http://username:password@subdomain.domain.example.net:80/
http://12.45.67.89/
etc当然
urlparse
已经做得很好了(通常没有regex)。