我只想通过这些方法获得更有效的答案

时间:2018-11-28 01:43:04

标签: python string methods

过去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()方法的解决方案。我不想继续将字符串转换为列表来解决此类问题。

4 个答案:

答案 0 :(得分:1)

使用findrfind

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