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