如何按特定条件补全文本文件中缺失的序列URL
补全同一基础路径下缺失的数字序列URL
需要处理包含多个URL的文本文件,对比相邻行的链接,补全同一基础路径下缺失的数字序列URL。例如:
输入相邻链接:
https://gp.to/ab/394/las69-02-09-2020/ https://gp.to/ab/394/las69-02-09-2020/4/
输出需补全中间序列:
https://gp.to/ab/394/las69-02-09-2020/ https://gp.to/ab/394/las69-02-09-2020/2/ https://gp.to/ab/394/las69-02-09-2020/3/ https://gp.to/ab/394/las69-02-09-2020/4/
完整输入示例
https://gp.to/ab/394/las69-02-09-2020/ https://gp.to/ab/394/las69-02-09-2020/4/ https://gp.to/ab/563/dimp-02-07-2023/ https://gp.to/ab/39443/omegs-02-07-2023/ https://gp.to/ab/39443/omegs-02-07-2023/3/ https://gp.to/ab/39443/lis-22-04-2018/ https://gp.to/ab/39443/lis-22-04-2018/2/ https://gp.to/ab/39443/madi-22-04-2018/ https://gp.to/ab/39443/madi-22-04-2018/5/
预期输出示例
https://gp.to/ab/394/las69-02-09-2020/ https://gp.to/ab/394/las69-02-09-2020/2/ https://gp.to/ab/394/las69-02-09-2020/3/ https://gp.to/ab/394/las69-02-09-2020/4/ https://gp.to/ab/563/dimp-02-07-2023/ https://gp.to/ab/39443/omegs-02-07-2023/ https://gp.to/ab/39443/omegs-02-07-2023/2/ https://gp.to/ab/39443/omegs-02-07-2023/3/ https://gp.to/ab/39443/lis-22-04-2018/ https://gp.to/ab/39443/lis-22-04-2018/2/ https://gp.to/ab/39443/madi-22-04-2018/ https://gp.to/ab/39443/madi-22-04-2018/2/ https://gp.to/ab/39443/madi-22-04-2018/3/ https://gp.to/ab/39443/madi-22-04-2018/4/ https://gp.to/ab/39443/madi-22-04-2018/5/
原代码存在的问题
- 未校验基础路径一致性:原代码没有判断相邻URL是否属于同一基础路径,若下一个URL是完全不同的路径,会错误尝试补全。
- 未处理基础路径(无数字)的情况:当当前URL是基础路径(无数字后缀),下一个URL是该路径下的数字子路径时,原代码无法识别并补全中间序列。
- URL生成逻辑有误:原代码使用
current_url.rsplit('/', 1)[0]生成新URL,当当前URL是基础路径时,这种方式会导致路径错误。
修正后的代码
def parse_url(url): """解析URL,返回(基础路径, 数字),数字为None表示是基础路径""" parts = url.strip().split('/') # 过滤空字符串(URL结尾是/,split后最后一个元素为空) parts = [p for p in parts if p] # 从后往前查找数字部分 for idx in range(len(parts)-1, -1, -1): if parts[idx].isdigit(): # 提取数字的父路径作为基础路径 base_path = '/'.join(parts[:idx]) + '/' return (base_path, int(parts[idx])) # 未找到数字,返回原URL作为基础路径 return (url.strip(), None) # 读取输入文件,过滤空行 with open('input.txt', 'r') as input_file: lines = [line.strip() for line in input_file if line.strip()] output_lines = [] for i in range(len(lines)): current_url = lines[i] output_lines.append(current_url + '\n') # 保留换行符,保证输出格式一致 if i + 1 >= len(lines): continue next_url = lines[i+1] current_base, current_num = parse_url(current_url) next_base, next_num = parse_url(next_url) # 仅当基础路径相同时才执行补全逻辑 if current_base != next_base: continue # 场景1:当前是基础路径,下一个是带数字的子路径 if current_num is None and next_num is not None and next_num > 1: for num in range(2, next_num): new_url = f"{current_base}{num}/" output_lines.append(new_url + '\n') # 场景2:当前和下一个都是同基础路径下的数字子路径,且存在缺失序列 elif current_num is not None and next_num is not None and next_num > current_num + 1: for num in range(current_num + 1, next_num): new_url = f"{current_base}{num}/" output_lines.append(new_url + '\n') # 写入输出文件 with open('output.txt', 'w') as output_file: output_file.writelines(output_lines)
代码说明
parse_url函数:负责解析每个URL,分离出基础路径和对应的数字(如果有)。例如:- 输入
https://gp.to/ab/394/las69-02-09-2020/4/,返回("https://gp.to/ab/394/las69-02-09-2020/", 4) - 输入
https://gp.to/ab/394/las69-02-09-2020/,返回("https://gp.to/ab/394/las69-02-09-2020/", None)
- 输入
- 路径一致性校验:只有相邻URL的基础路径完全相同时,才会执行补全逻辑,避免跨路径错误补全。
- 两种补全场景处理:
- 基础路径到带数字子路径:补全2到目标数字-1的序列
- 同基础路径下的两个数字子路径:补全中间缺失的数字序列
- 换行符处理:确保输出的每一行都有正确的换行符,与输入格式保持一致。
内容的提问来源于stack exchange,提问作者nicholaspooran
相关产品推荐
相关产品推荐

