我想用文件中的空白替换某一格式的所有行,即用“”替换一行数字/数字/数字(如日期)和数字:数字(如时间) 。
您不能使用str.replace
来匹配模式或格式,只能使用文字字符串。
要匹配一个模式,你需要某种解析器。对于这样的模式,标准库中内置的正则表达式引擎re
已经不够强大了......但您需要学习如何为您的模式编写正则表达式。如果您已经了解基础知识,那么参考文档和Regular Expression HOWTO非常棒;如果没有,你应该在其他地方搜索教程。
总之,这里的你如何做到这一点(沿途固定一些其他的东西,大多由乐高Stormtroopr解释):
import re
with open("old_text.txt") as old_file, open("new_text.txt", "w") as new_file:
for line in old_file:
cleaned_line = re.sub(r'\d+/\d+/\d+', '', line)
cleaned_line = re.sub(r'\d+:\d+', '', cleaned_line)
new_file.write(cleaned_line)
另外请注意,我在第二sub
使用cleaned_line
;再次使用line
,就像在你的原始代码中一样,意味着我们失去了第一次替换的结果。
不知道你的问题的确切定义,我不能保证这确实是你想要的。你是否想要删除包含模式编号/编号/编号的所有行,将所有没有任何内容的行全部清空但是表示该模式,只显示该模式并将该行的其余部分单独留空?所有这些都是可行的,很容易,re
,但他们都做了一点不同。
如果你想获得一些技巧,你可以使用一个re.sub
表达式替换所有匹配线,空行的一次,而不是迭代他们一次一个。这意味着稍微更复杂的正则表达式与略微更简单的Python代码相比,这意味着对于中等大小的文件可能会有更好的性能,但对于大型文件而言性能(以及上限)会更差,等等。如果你不知道如何自己编写合适的表达式,并且没有性能瓶颈可以解决,我会坚持使用显式循环。
将'old_file.close'改为'old_file.close()'对于new_file相同 –
[''with'命令的这个问题将会很方便](http://stackoverflow.com/questions/9282967/how-to -open-a-file-using-the-open-with-statement) – 2013-10-02 00:14:08
你在for循环中不需要'old_file.readlines():'。你可以在'old_file'中输入':老实说,在我读代码之前,我甚至都不知道'readlines'甚至是存在的。 – Shashank