【问题标题】:How to match only the domain part of a URL with regex?如何仅将 URL 的域部分与正则表达式匹配?
【发布时间】:2017-03-27 13:14:38
【问题描述】:

我正在编写一个 Python 代码来处理一段文本,其中在对我来说无用的文本中,包含 URL。在文本块中,我只需要域,而不是完整的 URL。示例输入:

47.91.158.176 or 54.145.185.110 port 80 - gooolgeremf.top - GET /search.php
47.90.205.113 or 35.187.59.173 port 80 - voperforseanx.top/site/chrome_update.html

所以在这里我只需要匹配gooolgeremf.topvoperforseanx.top,但我编写的正则表达式也将匹配search.phpchrome_update.html

我在想的是正则表达式应该在/ 之后停止匹配。但是我不知道如何实现它,尤其是如何不阻止出现在整个文本文件中第一个 / 之后的匹配域。

到目前为止它在我的代码中的工作方式:

regexdm="[A-Za-z0-9]{1,}\.[A-Za-z0-9]{1,10}\.?[A-Za-z]{1,}\.?[A-Za-z]{1,}"
dmsc=re.findall(regexdm, iocsd.read())

【问题讨论】:

  • 您是指 FQDN/主机名,还是仅指域名?

标签: python regex


【解决方案1】:

我建议添加分隔符条件。如果域名只能由空格、行首/行尾和域前两个正斜杠和一个斜杠包围,则正则表达式为:

(?: |//|^)([A-Za-z0-9]{1,}\.[A-Za-z0-9]{1,10}\.?[A-Za-z]{1,}\.?[A-Za-z]{1,})(?: |/|$)

演示:https://regex101.com/r/TQKlDP/1

【讨论】:

  • RaminNietzsche:这是因为原始正则表达式不允许此类域名(即 TLD 中少于三个字母的域名)。我承认域名过滤器看起来限制性太强,甚至是错误的,但我准备了一个答案,假设此类限制是故意的(或至少可以接受),唯一的问题是将此类域名与文本的其他部分区分开来.
【解决方案2】:

正则表达式不是最简单的方法,你应该使用urlparse.urlparse:

from urlparse import urlparse
parsed_uri = urlparse('http://voperforseanx.top/site/chrome_update.html')
print parsed_uri.netloc

给予

voperforseanx.top

但是,作为参考,这里是如何使用正则表达式处理 URL:Getting parts of a URL (Regex)

【讨论】:

  • netloc 将不会显示域,如果您删除问题输入中所示的“http://”。返回无。
【解决方案3】:
(\b[\w\.]+\.[a-zA-Z]{2,}\b)(.+)$

在这个正则表达式中:

(\b[\w\.]+\.[a-zA-Z]{2,}\b)

部分,将匹配您要查找的内容,其余部分为废品。为了工作,这个正则表达式需要一个 gmi 修饰符。

【讨论】:

【解决方案4】:

在 Python 2.7.13 中,另一种方式示例(取决于输入模式):

str = "47.90.205.113 or 35.187.59.173 port 80 - voperforseanx.top/site/chrome_update.html"
parsed_uri = str.split()[6].split('/')[0]
print parsed_uri
>> voperforseanx.top

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 2015-04-12
    • 1970-01-01
    • 2020-01-02
    • 2012-03-18
    • 2019-03-07
    • 2019-03-08
    相关资源
    最近更新 更多