过去2周,我一直在自学python。今天,我遇到了一个问题,并且有一个非常烦人的解决方案(对于必须阅读该文件的人,我感到很难过)。因此,首先,我将介绍该问题及其解决方案。
问题:完成getHost()函数,该函数接受一个表示URL的单个字符串参数,然后返回与 响应主机名的倒数第二个部分。例如,给定URL“ http://www.example.com/”,该函数
将返回字符串“ example”。给定URL“ ftp://this.is.a.long.name.net/path/to/some/file.php”,该函数将 返回字符串“名称”。虽然网址的路径和文件名部分是可选的,但您可以假定完整的 主机名后总是一个单斜杠(“/")。
我的解决方案:
def getHost(x):
newstring = ""
listofx = []
for i in range(len(x)):
listofx.append(x[i])
for j in range(2):
a = listofx.index("/")
listofx.reverse()
for k in range(a+1):
listofx.pop()
listofx.reverse()
b = listofx.index("/")
for g in range(len(listofx)-b):
listofx.pop()
for t in range(listofx.count(".")-1):
for o in range(listofx.index(".")+1):
listofx.reverse()
listofx.pop()
listofx.reverse()
for f in range(len(listofx)-listofx.index(".")):
listofx.pop()
for h in range(len(listofx)):
newstring = newstring + listofx[h]
print (newstring)
我讨厌我的解决方案,因为看看我使用了多少个for循环。我感觉我别无选择,因为字符串是不可变的。我希望有人可以向我展示使用while循环和find()/ rfind()方法的解决方案。我不想继续将字符串转换为列表来解决此类问题。
答案 0 :(得分:1)
使用find
和rfind
:
def getHost(x):
index1 = x.find('//')
index2 = x.find('/', index1+2)
index3 = x.rfind('.',index1+2, index2)
return(x[:index3].split('.')[-1])
答案 1 :(得分:0)
是的,有更好的(pythonic)方法
def extract(data):
print(data.split('/')[2].split('.')[-2])
extract("http://www.example.com/")
extract("ftp://this.is.a.long.name.net/path/to/some/file.php")
输出(显然)
example
name
答案 2 :(得分:0)
假设您的网址始终带有双斜杠,您可以使用以下内容;
url = "http://www.example.com/"
url = url.split("/")
url = url[2].split(".")
getHost = url[-2]
print(getHost)
答案 3 :(得分:0)
实际上,是一个不需要rfind
的简单版本:
def getHost(x):
index1 = x.find('//')
index2 = x.find('/', index1+2)
return(x[:index2].split('.')[-2])
print(getHost("ftp://this.is.a.long.name.net/path/to/some/file.php"))
print(getHost("http://www.example.com/"))