2015-02-23 176 views
2

我有一個表達式列表,我想在文件中替換每個表達式。替換文件中的字符串

我嘗試這個代碼

for a in ex: 
    if a in file.split(): 
     file = file.replace(a, '[' + ' ' + a + ' ' +']') 
print file 

我的代碼還取代是括號之間的另一種表達式的一部分的表達式。所以我想要的是隻替換括號內不屬於另一個表達式的表達式。 我如何獲得理想的結果?

回答

5

你可以通過re模塊來做到這一點。這裏模式的順序非常重要。由於'organizations of human rights'位於'human rights'之前,因此正則表達式引擎會嘗試首先找到organizations of human rights這個字符串。如果發現匹配,則它將用[ +匹配+ ]取代匹配。然後它轉到下一個模式,即human rights是否通過前一模式找到匹配。現在這個human rights模式將匹配organizations of human rights字符串中不存在的所有human rights字符串。因爲默認情況下regex不會進行重疊匹配。如果你想要正則表達式模式做一個重疊匹配,那麼你需要把模式放在周圍,模式必須被(),即捕獲組)包圍。

>>> ex = ['liberty of freedom', 'liberty', 'organizations of human rights', 'human rights'] 
>>> file = " The american people enjoys a liberty of freedom and there are many international organizations of human rights." 
>>> reg = '|'.join(ex) 
>>> import re 
>>> re.sub('('+reg+')', r'[\1]', file) 
' The american people enjoys a [liberty of freedom] and there are many international [organizations of human rights].'