Skip to main content
 首页 » 编程设计

python之正则表达式(Python)计算域名中的元素

2025年01月19日40JeffreyZhao

我想解析一个 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']