2017-11-07 13 views
1

私はこのサイトの私の質問に対する答えを探しました。そう、Python正規表現置換(複数行、部分のみ)

が、私は私の問題に情報を変換することはできませんよ:そこのような答えの質問があります

私は特定の値を交換する必要がありますテキストファイルに保存します。ファイル構造は次のようになります。

black 
{ 
    part cone; 
    value 20; 
} 
yellow 
{ 
    part wing; 
    value 30; 
} 

GUIでは、ユーザーは色と新しい値を定義します。例:black = 30。ユーザーがスクリプトを開始する場合、入力値はa="black"b=30です。コードの

私の作品:

dpd=open("colors","r+") 
ft=dpd.read() 
ft_new=re.sub(???,???,ft) 
dpd.seek(0) 
dpd.write(ft_new) 
dpd.truncate() 
dpd.close() 

私はこのような何か試してみました:

re.sub(str(a)+'\n.*\n.*\n.*value [0-9][0-9]?',str(a)+'\n.*\n.*\n.*?value '+str(b),ft) 

をしかし、これは動作しません。私は単一の文字列をどのように置き換えるかを理解していますが、ファイル内の特定の場所で特定の値を置き換える方法はありません。

+0

キャプチャグループと置換後の参照が必要です。 format(a)、r '\ g <1> {}のような 're(r'(?m)^({} \ n {{\ n。* \ n \ s *値\ s + '.format(b)、ft) ' - [this regex demo](https://regex101.com/r/sgh2rV/1)を参照してください –

+0

ありがとうございます。できます。今私は獣医などと再びそれを理解しようとするでしょう。私はあなたの答えをupvoteしたいと思いますが、私はそれを行う方法を取得していません。 – finkae

答えて

0

あなたはパターンがregex demo

詳細

  • 01を参照してください

    (?m)^(black\n{\n.*\n\s*value\s+)\d+ 
    

    のようになります。

    ft_new = re.sub(r'(?m)^({}\n{{\n.*\n\s*value\s+)\d+'.format(a), r'\g<1>{}'.format(b), ft) 
    

    を使用することができますから

  • (black\n{\n.*\n\s*value\s+)ラインの開始 - グループ1:
    • blackからblack
    • \n{\n - 改行、{、改行
    • .*から
    • \n\s*行全体 - 改行してから0+空白
    • value - valueサブストリング
    • 個の
    • \s+ - 1+空白
  • \d+から1桁以上。

交換、\g<1>30は、2つの部分から構成:

  • \g<1>から

7.2.1. Regular Expression Syntaxを通過してください値30から

  • 30グループ1に明確な後方参照。