简单的正则表达式问题:从文件中删除所有新行

时间:2009-08-08 19:16:00

标签: python regex

我正在熟悉python并且正在创建问题以帮助自己学习语言的细节。我的下一个问题如下:

我已经从互联网上复制并粘贴了大量文本,但复制和粘贴添加了几行来分解巨大的字符串。我希望以编程方式删除所有这些并将字符串返回到一大块字符中。这显然是正则表达式的一项工作(我认为),并且解析整个文件并删除换行符的所有实例听起来就像它可以工作一样,但对我来说似乎并没有那么好。

有一个简单的方法可以解决这个问题吗?看起来很简单。

6 个答案:

答案 0 :(得分:34)

两个主要选择:将所有内容作为单个字符串读取并删除换行符:

clean = open('thefile.txt').read().replace('\n', '')

或,逐行阅读,删除结束每一行的换行符,然后重新加入:

clean = ''.join(l[:-1] for l in open('thefile.txt'))

前一种选择可能更快,但是,与往常一样,我强烈建议您在特定兴趣的情况下测量速度(例如,使用python -mtimeit),而不是仅仅假设您知道性能如何。 RE可能更慢,但是,再次:不要猜测,MEASURE!

所以这里有一些笔记本电脑上特定文本文件的数字:

$ python -mtimeit -s"import re" "re.sub('\n','',open('AV1611Bible.txt').read())"
10 loops, best of 3: 53.9 msec per loop
$ python -mtimeit "''.join(l[:-1] for l in open('AV1611Bible.txt'))"
10 loops, best of 3: 51.3 msec per loop
$ python -mtimeit "open('AV1611Bible.txt').read().replace('\n', '')"
10 loops, best of 3: 35.1 msec per loop

该文件是KJ Bible的一个版本,从here下载并解压缩(我认为在一个容易获取的文件上运行此类测量非常重要,因此其他人可以轻松地重现它们!)。

当然,对于4.3 MB,34,000行的文件,或多或少几毫秒,对你来说可能并不重要;但是最快的方法也是最简单的方法(远非异常情况,特别是在Python中;-),我认为这是一个非常好的建议。

答案 1 :(得分:9)

我不会使用正则表达式来简单地替换换行符 - 我会使用string.replace()。这是一个完整的脚本:

f = open('input.txt')
contents = f.read()
f.close()
new_contents = contents.replace('\n', '')
f = open('output.txt', 'w')
f.write(new_contents)
f.close()

答案 2 :(得分:3)

import re
re.sub("\n", "", file-contents-here)

答案 3 :(得分:3)

我知道这是一个python学习问题,但如果你曾尝试从命令行执行此操作,则无需编写python脚本。以下是其他几种方式:

cat $FILE | tr -d '\n'

awk '{printf("%s", $0)}' $FILE

这些都不必将整个文件读入内存,所以如果你有一个巨大的文件要处理,它们可能比提供的python解决方案更好。

答案 4 :(得分:0)

老问题,但由于它是在我的搜索结果中进行类似的查询,并且没有人提到过python字符串函数strip() || lstrip() || rstrip(),我只会为后代添加它(以及任何不喜欢使用的人)在没有必要时重新开始):

old = open('infile.txt')
new = open('outfile.txt', 'w')
stripped = [line.strip() for line in old]
old.close()
new.write("".join(stripped))
new.close()

答案 5 :(得分:0)

所有使用<string>.replace('\n','')的示例都是删除所有回车符的正确方法。

如果您有兴趣删除所有多余的新行以进行调试等,请按以下步骤操作:

import re
re.sub(r"(\n)\1{2,}", "", _your_string).strip()