2013-06-20 188 views
10

我試圖刪除我的正則表達式匹配的所有行(正則表達式只是尋找任何有雅虎的行)。每場比賽都在自己的隊伍中,所以不需要多線選項。使用Python刪除所有行匹配正則表達式

這是我迄今爲止...

import re 
inputfile = open('C:\\temp\\Scripts\\remove.txt','w',encoding="utf8") 

inputfile.write(re.sub("\[(.*?)yahoo(.*?)\n","",inputfile)) 

inputfile.close() 

我收到以下錯誤:

回溯(最近通話最後一個): 線170,在子 回報_compile (圖案,標誌).SUB(REPL,串,計數) 類型錯誤:預期的字符串或緩衝區

+3

那麼,有什麼問題呢? – arshajii

+0

您沒有閱讀文件。你需要像'inputfile.readlines()' – karthikr

+0

這樣的東西你試圖關閉你從未打開過的2個文件,並且命名一個打開'inputfile'文件的文件最多隻會讓你感到困惑。 – geoffspear

回答

10

使用,如果要修改原文件fileinput模塊:

import re 
import fileinput 
for line in fileinput.input(r'C:\temp\Scripts\remove.txt', inplace = True): 
    if not re.search(r'\byahoo\b',line): 
     print line, 
+0

這個伎倆!謝謝!!! – MrMr

+0

它在仍然存在的文本之間添加新行。有關如何避免這種情況的任何提示? – MrMr

+0

我試過打印線,打印(行)和打印(行),似乎沒有工作。 – MrMr

3

你要讀文件嘗試類似:

import re 
inputfile = open('C:\\temp\\Scripts\\remove.txt','w',encoding="utf8") 

inputfile.write(re.sub("\[(.*?)yahoo(.*?)\n","",inputfile.read())) 

file.close() 
outputfile.close() 
4

這裏是@Ashwini Chaudhary's answer Python 3的變種:

#!/usr/bin/env python3 
import fileinput 
import re 
import sys 

def main(): 
    pattern, filename = sys.argv[1:] # get pattern, filename from command-line 
    matched = re.compile(pattern).search 
    with fileinput.FileInput(filename, inplace=1, backup='.bak') as file: 
     for line in file: 
      if not matched(line): # save lines that do not match 
       print(line, end='') # this goes to filename due to inplace=1 

main() 

它假定locale.getpreferredencoding(False) == 'utf-8'否則可能對非ASCII字符突破。

爲了讓無論是什麼工作,當前區域是或有不同的編碼輸入文件:

#!/usr/bin/env python3 
import os 
import re 
import sys 
from tempfile import NamedTemporaryFile 

def main(): 
    encoding = 'utf-8' 
    pattern, filename = sys.argv[1:] 
    matched = re.compile(pattern).search 
    with open(filename, encoding=encoding) as input_file: 
     with NamedTemporaryFile(mode='w', encoding=encoding, 
           dir=os.path.dirname(filename)) as outfile: 
      for line in input_file: 
       if not matched(line): 
        print(line, end='', file=outfile) 
      outfile.delete = False # don't delete it on closing 
    os.replace(outfile.name, input_file.name) 

main() 
相關問題