使用Python的re正则表达式从URL中提取域名

3

我希望输入一个URL并提取域名,该域名是http://或https://后面的字符串,并包含字符串、数字、圆点、下划线或破折号。

我编写了正则表达式,并使用Python的re模块,如下所示:

import re
m = re.search('https?://([A-Za-z_0-9.-]+).*', 'https://google.co.uk?link=something')
m.group(1)
print(m)

我的理解是m.group(1)将在re.search中提取括号()中的部分。

我期望得到的输出是:google.co.uk 但我得到的却是:

<_sre.SRE_Match object; span=(0, 35), match='https://google.co.uk?link=something'>

您能告诉我如何使用re来满足我的需求吗?

4个回答

9

您需要撰写的是

print(m.group(1))

甚至更好的做法是 - 先设置一个条件:
m = re.search('https?://([A-Za-z_0-9.-]+).*', 'https://google.co.uk?link=something')
if m:
    print(m.group(1))

1
Jan已经为此提供了解决方案。但是需要注意的是,我们可以在不使用re的情况下实现相同的功能。它只需要使用!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~进行验证。这个可以从string包中获得。
def domain_finder(link):
    import string
    dot_splitter = link.split('.')

    seperator_first = 0
    if '//' in dot_splitter[0]:
        seperator_first = (dot_splitter[0].find('//') + 2)

    seperator_end = ''
    for i in dot_splitter[2]:
        if i in string.punctuation:
            seperator_end = i
            break

    if seperator_end:
        end_ = dot_splitter[2].split(seperator_end)[0]
    else:
        end_ = dot_splitter[2]

    domain = [dot_splitter[0][seperator_first:], dot_splitter[1], end_]
    domain = '.'.join(domain)

    return domain

link = 'https://google.co.uk?link=something'
domain = domain_finder(link=link)
print(domain) # prints ==> 'google.co.uk'

这只是另一种解决方案,无需使用re


0

有一个名为tldextract的库在这种情况下非常可靠。

以下是它的工作原理

import tldextract

def extractDomain(url):
    if "http" in str(url) or "www" in str(url):
        parsed = tldextract.extract(url)
        parsed = ".".join([i for i in parsed if i])
        return parsed
    else: return "NA"

op = open("out.txt",'w')
# with open("test.txt") as ptr:
#   for lines in ptr.read().split("\n"):
#       op.write(str(extractDomain(lines)) + "\n")

print(extractDomain("https://test.pythonhosted.org/Flask-Mail/"))

输出如下:

test.pythonhosted.org

但是我需要子域名,顺便说一下。我认为第一个更可靠。这个库依赖于硬编码列表。因此它取决于列表的更新程度。 - user9371654
是的,两者都提供了很好的结果。在我的用例中,我只需要获取域名,这对我非常有帮助。我还测试了10K个不同的URL,两者都没有任何问题。 - Dhamodharan

0

最简单的方法是使用urllib包

from urllib.parse import urlsplit
s = "https://google.co.uk?link=something"
urlsplit(s).netloc

输出结果为

'google.co.uk'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接