2016-09-22 16 views
0

タイトルには申し訳ありませんが、フレーズが良い方法を見つけることができませんでした。私が持っていることは(それらの間のフィラーの大きさがあるとして、すべてのインデントされたグループのサイズは、artbitraryである)このようになります構造体です:同じキャプチャグループを複数回、不確実な回数に置き換える方法は?

q 
111: 
    a 
    b 
    c 
w 
e 
222: 
    d 
    e 
    f 
    g 
r 

私はそれがこのように見えるように変換したい:

q 
111: a 
111: b 
111: c 
w 
e 
222: d 
222: e 
222: f 
222: g 
r 

私は現在、現在これを実行しています:1)各インデントされたグループの最後のタブを検索し、それを 'ヘッダー'に置き換えます。 2)インデントされた最大のグループの項目ごとに1回のプロセス全体を繰り返します。 3)ヘッダーを手動で取り外します。言うまでもなく、これはハックのような感じです。これは私が最初のステップで使用している正規表現です:^([^\n]*:)(.*?)\t(?![^\n]*?\n\t) → \1\2\1[ ] 私が本当に好きなのは、すべてのインデントされたグループのすべてのタブを一度に置き換えることですが、これを行う方法が見つかりません。私はPythonのre(または、むしろこのライブラリを使用するSublime Text regexプラグイン)を使用しています。

+1

あなたは別のツールでこれを処理することはできますか?たぶんawkです。正規表現が仕事のための最良のツールであるかどうかは分かりません。 – wpcarro

+1

regexp replaceにループがありません。 @wcarrollが示唆するように、より良いツールを使用してください。 – Barmar

答えて

2

正規表現がここで使用するのに最適なツールかどうかはわかりません。 awkのような、より尖ったテキスト処理ツールを使用します。

{ 
    if (match($0, /^[0-9]+:$/)) { 
    num = $1; 
    } 
    else if(match($0, /^[ ]+[a-z]$/)) { 
    print num, $NF; 
    } 
    else { 
    print $0; 
    } 
} 

あなたはこのようにそれを実行することができます。

$ awk -f /tmp/script.awk </tmp/file.ext 

出力:

q 
111: a 
111: b 
111: c 
w 
e 
222: d 
222: e 
222: f 
222: g 
r 

script.awkが上記のスニペットで、file.extはあなたが処理する必要があるファイルです。

0

あなたは、Pythonを使用している場合は、代替手段はライン上だけでループになると、あなたの結果を構築することができます:

import re 

res = [] 
key = '' 
for s in input.splitlines(): 
    if s.endswith(':'): 
     key = s 
    else: 
     res.append(re.sub('^\\t', key, s)) 
res = '\n'.join(res) 

print(res) 
関連する問題