我想用文件中的空白替換某一格式的所有行,即用「」替換一行數字/數字/數字(如日期)和數字:數字(如時間) 。
您不能使用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