2017-11-28 12 views
0

正規表現を使ってファイル内の複数の行を削除したいと思います。私は、例えばhost_nameのようなホスト名を選択するとpythonでregexを使ってテキストファイル内の複数行を削除するには?

host host_name { 
# comment (optional) 
    hardware ethernet 01:22:85:EA:A8:5D; 
    fixed-address 192.168.107.210; 
} 

host another_host_name { 
# comment (optional) 
    hardware ethernet 01:22:85:EA:A8:5D; 
    fixed-address 192.168.107.210; 

} 

基本的には、それはそれを持っているラインを検出してまで、それの後にすべての行を削除します:

私はこのようなものを使用してファイルを持っていますそれは最初{遭遇:

#before 


host host_name { 
# comment (optional) 
    hardware ethernet 01:22:85:EA:A8:5D; 
    fixed-address 192.168.107.210; 
} 

host another_host_name { 
# comment (optional) 
    hardware ethernet 01:22:85:EA:A8:5D; 
    fixed-address 192.168.107.210; 

} 

#after 

host another_host_name { 
# comment (optional) 
    hardware ethernet 01:22:85:EA:A8:5D; 
    fixed-address 192.168.107.210; 

} 

私たちはm = search('r"^host.*}', line)のようなものを使用すると思いますが、それは複数行のためではないラインのものでラインで働いています。

def remove(filename, hostname): 
      with open(os.path.abspath("app/static/DATA/{}".format(filename)), "a") as f: 
      for line in f: 
       m = search('r"^hostname.*}', line, re.MULTILIGNE) 
       if m: 
        #we delete the bloc, I don't know how to do it though 

このようにして始めますか?

+0

これは非常に乱雑になるだろう、そこに行かないでください。 'dhcp.conf'に完全な吹き抜けのパーサーを見つけてください:https://pypi.python.org/pypi/iscconf https://pypi.python.org/pypi/iscpy/1.0.1 https://pypi.python .org/pypi/bicop/ – Pavel

+2

[マルチラインモード](https://docs.python.org/3/library/re.html#re.MULTILINE)を有効にしましたか? – Kevin

+0

@Pavel私は初心者です。私はそれらを一度も使用しませんでした。少なくとも正規表現を使う前に、私はそれが最善のものではないかもしれないことを知っていますが、その方法を提案しました。 – Draga

答えて

0

私には3つのアイデアがあります。

  • マルチモードを試してください。あなたはそれについてもっと読むことができます:https://docs.python.org/3/library/re.html#re.MULTILINE私はあなたが求めていることをすると思います。

  • これはちょっとしたことではないが、私はチートする。私はすべての\ nを "this_is_my_special_holder"のような奇妙なものに交換する事前正規表現を実行します。今はすべてが1行になっています。私はあなたが書いたように私がしたい仕事をします。それから、すべての "this_is_my_special_holder"を\ nに戻すポスト正規表現を実行します。あなたは今までに複数行をサポートしていない言語で立ち往生した場合、これは常にそれが:)成し遂げる必要がある

  • あなたはちょうど私の例がここだけでなく、正規表現を実行することができる場合があります

輸入を私は「で」でファイルを開く

def main(regex_part): 
    the_regex = re.compile("".join(["host ", regex_part, " {[^}]+}"])) 
    with open('test.txt', 'r') as myfile: 
     data=myfile.read() 
     data = re.sub(the_regex, "", data) 
     print (data) 
     with open('test2.txt', 'w') as newfile: 
      newfile.write(data) 

main("host_name") 

、後でファイルハンドルを閉じる必要はありません。そのように再:ここに

は、私はこの全体のことをするだろう方法です。 'r'はファイルを読み込み、 'w'はファイルを書き出すことです。正規表現は単に次のものに置き換えられます。

host host_name { everything up to the next } and then the next } 

何も付いていません。

http://regex101.comは、正規表現で実際にプレイするための便利なサイトです。がんばろう!

+0

プログラムの例で自分の投稿を編集しましたが、私がうまく始まっているかどうか教えていただけますか? – Draga

+0

私はコードの少しの例を書きます:) – sniperd

+0

うわー、それは私が欲しいものです、今私はちょうどhost_name = request.form.get( 'host_name')のような "host_name"動的にしたい私はre.sub( "host host_name、etc ..."、データ)を使用して、それは可能ですか?あなたのリンクは素晴らしいbtwです。 – Draga

関連する問題