Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python从URL中提取域名';s re regex_Python_Regex_Python 3.x - Fatal编程技术网

使用python从URL中提取域名';s re regex

使用python从URL中提取域名';s re regex,python,regex,python-3.x,Python,Regex,Python 3.x,我想输入一个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)将在搜索中提取()之间的部分 我期望的输出是:googl

我想输入一个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)
将在搜索中提取()之间的部分

我期望的输出是:
google.co.uk
但我明白了:

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

你能告诉我如何使用
re
来达到我的要求吗?

你需要写

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))

有一个名为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

Jan已经为此提供了解决方案。但需要注意的是,我们可以在不使用
re
的情况下实现相同的功能。它只需要
!“#$%&\'()*+,-./:;?@[\]^ `{124;}
用于验证目的。可从
字符串
包中获得相同的信息

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

,但我需要子域。顺便说一句,我认为第一个更可靠。这个库依赖于硬编码列表。因此它取决于列表的更新程度。是的,两者都提供了很好的结果。在我的用例中,我必须单独获取域名,这对我很有帮助。还做了一些测试10万个不同的URL都可以正常工作