2016-11-04 30 views
2

Spoiler:是的,這是一項任務。它被解決了,但爲了個人興趣,我想知道下面的內容。使用python中的re.sub替換單個詞

所以此刻與語法標記的分配,工作中,我們輸入一個文件,並使用正則表達式的字典,因此它們上色(關鍵字)。

雖然有一些問題。

for i in iterations: 
    pass 
在這上面一行

,使用正則表達式 r'(\t*for.*in.*?:.?)'將工作,但它會顏色在整個線。雖然這是允許的,我真的很喜歡它只能標記for/in

r'(\bfor\b|\bin\b)'一起嘗試不是仁慈的,也不是r'(for)'或r'(\ s for \ s)'。

予讀取整個碼成一個字符串和使用應用re.sub()與colour + r'\1' + colour_end更換所有出現在那裏顏色指定顏色序列。

+0

使用' '將替換爲'$ 1 $ 2 $ 3 $ 4 $ 5' –

+0

應該提及上面的內容(將e()*(*)(in) dit),但所有的正則表達式都來自文件字典(每行格式爲「regex」:type'例如'「(\ t * for。* in。*?:。?)」:for'並且程序也只使用一個捕獲組。因此應該可以運行're.sub()'兩次,並標記例如所有'for'第一個和所有'in'之後? –

+0

是的,這是可能的。 –

回答

1

您可以使用捕捉和反向引用:

^(\t*)(for\b)(.*)\b(in)\b(.*?:) 

替換$1<color>$2</color>$3<color>$4</color>$5。請參閱regex demo

這裏,表述被分成5子部分與(...)捕獲組。在替換模式中,捕獲的那些值使用具有$ + n格式的反向引用來引用,其中n是模式內的捕獲組的ID。

如果你沒有機會運行1個正則表達式與多個捕獲組,在結束運行兩個:

  • ^(\t*)for\b(?=.*\bin\b.*?:) - >$1<color>for</color>(見this demo
  • ^(\t*for\b.*)\bin\b(?=.*?:) - >$1<color>in</color>(見another demo) 。

單個捕獲組位於單詞前面的部分,單詞後面的部分不匹配,但用正向預覽檢查。

0

這裏是我的解決方案:

import re 

STR = """ 
for i in iterations: 
    pass 
""" 

pattern = r'(\b)(for|in|pass)(\b)' 
change = r'\1<COLOR>\2</COLOR>\3' 

print re.sub(pattern, change, STR) 

所以我捕捉與空格的關鍵字,讓他們回來爲\ 1 \ 3

這給:

<COLOR>for</COLOR> i <COLOR>in</COLOR> iterations: 
    <COLOR>pass</COLOR>