在Python中按特定字符串/部分字符串拆分列表对象

在Python中按特定字符串/部分字符串拆分列表对象,python,string,list,Python,String,List,基本上,我必须制作一个脚本来做一些事情,其中一部分是我必须访问一个包含我需要的各种数据的文件,更具体地说是链接和名称,问题是该文件没有真正特定的格式。 文件: 这或多或少是文件遵循的格式,当然,名称中自然有更多的单词,“更多文本”部分通常是描述。要读取文件,我只需执行以下操作: ssh.exec_command("gen list command") cat_stdin, cat_stdout, cat_stderr = ssh.exec_co

基本上,我必须制作一个脚本来做一些事情,其中一部分是我必须访问一个包含我需要的各种数据的文件,更具体地说是链接和名称,问题是该文件没有真正特定的格式。 文件:

这或多或少是文件遵循的格式,当然,名称中自然有更多的单词,“更多文本”部分通常是描述。要读取文件,我只需执行以下操作:

        ssh.exec_command("gen list command")
        cat_stdin, cat_stdout, cat_stderr = ssh.exec_command("cat listpath")
        cat_output = cat_stdout.readlines()
        for line in cat_output:
            line_split = line.splitlines()
从这里我得到了列表对象形式的整行

[Package For IoT - 0.0.4 - 279 - https://package-server.something.eu-central-1.host.com/production/package_manager/
device/tlt_custom_pkg_package_iot_0.0.4_morestuff.extention - More text - tlt_custom_pkg_package_iot 
- 0.0.4]
现在的问题是:如何使用列表对象来拆分它?由于每个包的字数不同,我不能使用空格或“-”进行拆分,不会更改的是服务器地址(至少现在不会更改,以后可能会更改),因此安全的选择是使用“https”部分拆分链接(我需要它,所以应该存储在变量中),然后使用“tlt\u自定义”名称的一部分(我也需要它),因为这个特定的词也保持不变,那么我可以进一步处理这个部分,并使其适应进一步的使用。但是,是的,这就是我挣扎的地方,因为我最近刚开始使用python,我被困在这一部分。 我尝试的是:

        for line in cat_output:
            line_split = line.splitlines()
            split_list = ["https", "tlt"]
            temp = zip(chain([0], line_split), chain(line_split, [None]))
            res = list(split_list[i] for i in temp)

            print(str(res))
这会导致错误:
列表索引必须是整数或切片,而不是元组
我还想从这里尝试解决方案: 但我不明白如何为自己调整这些解决方案

TL;DR我想从对象列表中获取完整链接和tlt_自定义字符串,但我不知道如何实现

更新 我尝试了几件我认为我得到了我需要的东西:

        ssh.exec_command("command")
        cat_stdin, cat_stdout, cat_stderr = ssh.exec_command("cat filepath")
        cat_output = cat_stdout.readlines()
        for line in cat_output:
            line_split = line.splitlines()
            temp = [i.split('https:')[1] for i in line_split]
            package_info = "https:"+str(temp[0])
            temp = package_info.split('.ipk')[0]
            package_link = str(temp)+".ipk"
            temp = package_info.split('tlt_')[2]
            package_name = "tlt_"+str(temp)

            print(package_link) 
            print(package_name) 

这样我得到了链接和名称,理论上它应该可以工作,但我觉得这有点复杂,因为我正在删除和添加部分字符串。有更好的解决方法吗?

嗯,如果我读对了,这里的实际分隔符是
'-'
。因此,你应该在这一点上分道扬镳:

ssh.exec_command("command")
cat_stdin, cat_stdout, cat_stderr = ssh.exec_command("cat filepath")

sep = ' - '              # DRY principle: write it once, use it many times
for line in cat_stdout:
    line_split = line.strip().split(sep)
    package_link = line_split[3]
    # joining last 2 fields will allow possible - chars in "More text"
    package_name = sep.join(line_split[-2:])
    print(package_link) 
    print(package_name) 
您甚至可以直接创建一个包含理解力的dict列表:

...
sep = ' - '
data = [{'link': line_split[3], 'name': sep.join(line_split[-2:])}
        for line in cat_out
        for line_split in (line.strip().split(sep),)]

temp
的每个元素都是一个
元组
,您使用
tuple
作为
列表索引
,但是
列表索引
必须是一个
整数
。我得到:
在尝试第一个选项时,“内置函数”或“方法”对象不可下标,我必须为它添加一些东西才能工作,还是它根本就不应该发生?@Wowy:我的错。输入错误:
line.split[-2]
而不是
line\u split[-2]
。我知道应该避免手动复制代码,但我有时会这样做……您能解释一下这个
行分割[-2:]
部分的作用吗?我特别不确定
@Wowy:这是从最后一个元素之前的元素开始的切片(所以是在最后一个和最后一个之前)。这包含了关于切片的详细解释
...
sep = ' - '
data = [{'link': line_split[3], 'name': sep.join(line_split[-2:])}
        for line in cat_out
        for line_split in (line.strip().split(sep),)]