如何在无换行符时查找替换多行文本块的垂直空白模式?
问题需求
现有如下文本:
col1 col2 col3 ----------------- -------------- ---- hello_world 345 1234
需要移除垂直方向上的冗余分隔模式(即列之间多余的横线和空格),将列间距统一收窄,最终得到:
col1 col2 col3 ----------- ---- ---- hello_world 345 1234
要求:处理过程中不能使用换行符(\r、\n等)作为判断或分割依据,如何实现?
实现方案
方案1:基于固定行宽的位置映射
这种方法无需依赖换行符,通过文本总长度和已知行数(这里是3行)计算单行长,再按位置提取每行内容,最后重新按目标列宽拼接:
def compact_columns(original_text, target_col_widths=[10, 5, 4]): # 计算单行长:总长度除以行数(已知为3行) line_length = len(original_text) // 3 # 按位置提取每行(不依赖换行符拆分) line1 = original_text[:line_length] line2 = original_text[line_length:2 * line_length] line3 = original_text[2 * line_length:] # 通过第二行的横线块定位列分隔点 sep_positions = [] current_pos = 0 while current_pos < line_length: if line2[current_pos] == '-': start = current_pos while current_pos < line_length and line2[current_pos] == '-': current_pos += 1 sep_positions.append((start, current_pos)) else: current_pos += 1 # 拆分每一行的列内容 cols1 = [line1[:sep_positions[0][0]].strip()] + [line1[s:e].strip() for s, e in sep_positions] cols2 = [line2[:sep_positions[0][0]].strip()] + [line2[s:e].strip() for s, e in sep_positions] cols3 = [line3[:sep_positions[0][0]].strip()] + [line3[s:e].strip() for s, e in sep_positions] # 按目标宽度对齐并拼接 result_lines = [] for cols in [cols1, cols2, cols3]: aligned_line = ' '.join(col.ljust(w) for col, w in zip(cols, target_col_widths)).rstrip() result_lines.append(aligned_line) return '\n'.join(result_lines) # 测试(输入为无换行的连续文本) original = "col1 col2 col3----------------- -------------- ----hello_world 345 1234" print(compact_columns(original))
方案2:正则表达式匹配垂直冗余模式
针对固定结构的文本,用正则匹配跨行的冗余分隔块(第一行空格、第二行横线、第三行空格的垂直组合),直接替换为紧凑的列间距:
import re def compact_with_regex(original_text): # 匹配固定结构的冗余分隔模式 pattern = re.compile( r'(\w+)\s+(\w+)\s+(\w+)(-+)\s+(-+)\s+(-+)(\w+)\s+(\d+)\s+(\d+)' ) # 替换为紧凑格式 return pattern.sub(r'\1 \2 \3\n----------- ---- ----\n\7 \8 \9', original_text) # 测试 original = "col1 col2 col3----------------- -------------- ----hello_world 345 1234" print(compact_with_regex(original))
内容的提问来源于stack exchange,提问作者revoua
相关产品推荐
相关产品推荐

