2016-09-22 90 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)搜索每個縮進組的最後一個選項卡,並將其替換爲'header'; 2)在最大縮進組中的每個項目重複整個過程一次; 3)手動刪除標題。不用說,這感覺非常像黑客。這是我用於第一步的正則表達式:^([^\n]*:)(.*?)\t(?![^\n]*?\n\t) → \1\2\1[ ] 我真的很想一次性替換每個縮進組中的所有選項卡,但我找不到任何方法來執行此操作。我使用Python的re(或者更確切地說是一個使用這個庫的Sublime Text regex插件)。

+1

你能與其他工具處理呢?也許'awk'。我不知道正則表達式是否是這裏工作的最佳工具。 – wpcarro

+1

正則表達式替換中沒有循環。 @wcarroll建議使用更好的工具。 – Barmar

回答

2

我不確定是否regex是在這裏使用的最佳工具。我會使用更加尖銳的文本處理工具,如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) 
相關問題