2013-06-20 36 views
10

Tôi đang cố xóa tất cả các dòng mà regex của tôi khớp với nhau (regex chỉ đơn giản tìm kiếm bất kỳ dòng nào có yahoo trong đó). Mỗi trận đấu nằm trên dòng riêng của nó, do đó không cần tùy chọn nhiều dòng.Sử dụng Python để loại bỏ tất cả các dòng khớp với Regex

Đây là những gì tôi có cho đến nay ...

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

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

inputfile.close() 

Tôi nhận được lỗi sau:

Traceback (cuộc gọi gần đây nhất cuối cùng): dòng 170, ở tiểu _compile trở lại (mẫu, cờ) .sub (repl, string, count) LoạiError: chuỗi hoặc bộ đệm dự kiến ​​

+3

Vì vậy, vấn đề là những gì? – arshajii

+0

bạn không đọc tệp. Bạn cần một cái gì đó như 'inputfile.readlines()' – karthikr

+0

Bạn đang cố gắng đóng 2 tệp mà bạn chưa bao giờ mở và đặt tên tệp được mở để viết 'inputfile' là khó hiểu nhất. – geoffspear

Trả lời

10

Sử dụng fileinput mô-đun nếu bạn muốn thay đổi các tập tin ban đầu:

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

Điều đó đã làm được điều đó! Cảm ơn bạn!!! – MrMr

+0

Nó thêm dòng mới giữa văn bản vẫn còn tồn tại. Bất kỳ lời khuyên nào về cách tránh điều này? – MrMr

+0

Tôi đã thử in dòng và in (dòng,) và in (dòng), dường như không có tác dụng. – MrMr

3

Bạn phải đọc tệp thử như sau:

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

Dưới đây là Python 3 biến thể của @Ashwini Chaudhary's answer:

#!/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() 

Nó giả locale.getpreferredencoding(False) == 'utf-8' nếu không nó có thể phá vỡ trên ký tự khác ASCII .

Để làm cho nó làm việc bất kể những gì locale hiện nay là hay cho các tập tin đầu vào có một mã hóa khác nhau:

#!/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() 
Các vấn đề liên quan