You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无换行符时查找替换多行文本块的垂直空白模式?

问题需求

现有如下文本:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:41:02