我想输入一个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
来达到我的要求吗?
答案 0 :(得分:2)
您需要写
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 :(得分: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
的情况下解决该问题的另一种方法。
答案 2 :(得分: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