17

正規表現が一致するすべての行を削除しようとしています (正規表現は単に yahoo を含む行を探しているだけです)。各一致はそれ自身の行にあるため、複数行オプションは必要ありません。

これは私がこれまでに持っているものです...

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

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

inputfile.close()

次のエラーが表示されます。

トレースバック (最新の呼び出しは最後): 170 行目、sub return _compile(pattern, flags).sub(repl, string, count) TypeError: 予想される文字列またはバッファ

4

3 に答える 3

17

元のファイルを変更する場合は、モジュールを使用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, end="")
于 2013-06-20T18:45:37.223 に答える
6

@Ashwini Chaudhary の answerの Python 3 バリアントを次に示します。正規表現を含むすべての行をpatterngiveから削除しfilenameます。

#!/usr/bin/env python3
"""Usage: remove-pattern <pattern> <file>"""
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) == input_file_encodingそうしないと、非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),
                                delete=False) as outfile:
            for line in input_file:
                if not matched(line):
                    print(line, end='', file=outfile)
    os.replace(outfile.name, input_file.name)

main()
于 2013-06-20T20:15:49.970 に答える
5

ファイルを読み取って、次のようなものを試してください。

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

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

file.close()
outputfile.close()
于 2013-06-20T18:45:02.543 に答える