我想解析一个 URL 并计算其域名中“元素”的数量。
例如,如果我有一个 url http://news.bbc.co.uk/foo/bar/xyzzy.html,我会对数字 4 感兴趣(news, bbc, co, uk) .
我一直回避正则表达式,因为它太神秘了。我通常会通过拆分//和/之间的字符串并计算它们之间的点数来做到这一点。这次我决定跳出自己的舒适区,大胆尝试一些 self 提升,用正则表达式来做,统计匹配组的数量。
这是我尝试过的:
pattern = r"^.*//(([^./]+\.)+)/.*$"
但这不匹配任何东西。我知道那里某处存在问题,至少在处理域 uk/的最后部分时(应该计入但应该消耗除点之外的其他内容),但仍然打破匹配组模式以便解析进入尾部。
我的想法是首先消耗所有内容,直到//包括//。这部分可能有效。然后我会开始匹配组,其中一个组是任何不是 .或/,重复直到一个点,然后消耗该点,直到所有此类组都被消耗完。这些将是我感兴趣的匹配组。然后使用/处理其余部分,因为我不再对它感兴趣了。这是错误的。
或者这是在不适合的地方使用正则表达式的徒劳尝试?
请您参考如下方法:
假设输入一致,您可以:
^[^:]+://([^/]+)
^[^:]+匹配从开始到第一个的一个或多个字符:://逐字匹配字符([^/]+)捕获的组包含一个或多个字符直到下一个/
你会得到例如news.bbc.co.uk 使用上面的代码,然后就是简单的 str.split('.') 了。
注意:显而易见的是,不要为此使用 Regex,使用适当的 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']
