0

我有一个大文本文件,由于控制台宽度,它在第 80 列有换行符。文本文件中的许多行不是 80 个字符长,并且不受换行符的影响。在伪代码中,这就是我想要的:

  • 遍历文件中的行
  • 如果行匹配此正则表达式模式:^(.{80})\n(.+)
    • 将此行替换为由 match.group(1) 和 match.group(2) 组成的新字符串。只需从此行中删除换行符即可。
  • 如果行与正则表达式不匹配,请跳过!

也许我不需要正则表达式来做到这一点?

4

4 回答 4

1

这是一些应该解决问题的代码

def remove_linebreaks(textfile, position=81):
    """
    textfile : an file opened in 'r' mode
    position : the index on a line at which \n must be removed

    return a string with the \n at position removed
    """
    fixed_lines = []
    for line in textfile:
        if len(line) == position:
            line = line[:position]
        fixed_lines.append(line)
    return ''.join(fixed_lines)

请注意,与您的伪代码相比,这将合并任意数量的连续折叠行。

于 2010-03-18T09:15:54.457 回答
1
f=open("file")
for line in f:
    if len(line)==81:
       n=f.next()
       line=line.rstrip()+n
    print line.rstrip()
f.close()
于 2010-03-18T09:26:33.140 回答
1

考虑一下。

def merge_lines( line_iter ):
    buffer = ''
    for line in line_iter:
        if len(line) <= 80:
            yield buffer + line
            buffer= ''
        else:
            buffer += line[:-1] # remove '\n'

with open('myFile','r') as source:
    with open('copy of myFile','w') as destination:
        for line in merge_lines( source ):
            destination.write(line)

我发现显式生成器函数可以更轻松地测试和调试脚本的基本逻辑,而无需创建模拟文件系统或进行大量花哨的设置和拆卸测试。

于 2010-03-18T10:16:40.547 回答
0

这是一个如何使用正则表达式来存档的示例。但是正则表达式并不是所有地方的最佳解决方案,在这种情况下,我认为不使用正则表达式更有效。无论如何,这是解决方案:

text = re.sub(r'(?<=^.{80})\n', '', text)

当您re.sub使用可调用对象调用时,您还可以使用正则表达式:

text = re.sub(r'^(.{80})\n(.+)', lambda m: m.group(1)+m.group(2), text)
于 2010-03-18T09:23:20.613 回答