2013-08-24 136 views
1

我需要檢查列表「listb」中的字符串,用「*」替換字符「<」。用Python正則表達式替換爲「*」

我想是這樣的:

import re 
for i in listb: 
    i = re.sub('\<','\*', 0) 

但我不斷收到類型錯誤:預期的字符串或緩衝區。

不知道我在做什麼錯誤和網上的例子沒有太大的幫助。

回答

2

docs

按照賽斯的評論,做到這一點使用正則表達式的最佳方式將是:

listb = [re.sub(r'<',r'*', i) for i in listb] 

由於@Paco,說,你應該使用str.replace()代替。但是如果你仍然想使用re:

你把0字符串應該去! TypeError來自第三個參數。這是一個int,需要是一個字符串。

附註:在正則表達式中始終使用原始字符串(由r''表示),因此您無需轉義。

>>> listb = ['abc', '<asd*', '<<>>**'] 
>>> for i in listb: 
...  i = re.sub(r'<',r'*', i) 
...  print i 
... 
abc 
*asd* 
**>>** 
>>> listb 
['abc', '<asd*', '<<>>**'] 
,如果你想與所有這些更換一個新的列表

,這樣做:

>>> listx = [] 
>>> for i in listb: 
...  listx.append(re.sub(r'<',r'*', i)) 
... 
>>> listx 
['abc', '*asd*', '**>>**'] 
>>> listb 
['abc', '<asd*', '<<>>**'] 
>>> listb = listx 

如果你真的不希望創建一個新的列表,你可以通過指數迭代。

請注意,您並未在列表中更改i。我會在這裏創建一個新列表。每個i這裏是它自己的變量,它不指向listb。

+0

這可以在一行上的列表理解中完成:'listb = [re.sub(r'<',r'*',i)for i in listb]'。這樣可以避免創建新的列表名稱,也可以避免重複遍歷索引。 – SethMMorton

+0

@SethMMorton是的,這是一個更好,更pythonic的方式來做到這一點。儘管如此,我想讓它儘可能接近他的原始代碼。我會將您的評論添加到我的答案中以獲得完整性。謝謝! – vroomfondel

+0

非常感謝,解決了問題。然而,我無法相信我看過的每個教程都說re.sub中的最後一個參數是應該進行替換的次數,「0」是無限的。此外,我會邏輯地期望,子實際上是替代,改變了原來的價值。謝謝你清理那個。 – user2684432

2
>>> my_string = 'fowiejf<woiefjweF<woeiufjweofj' 
>>> my_string.replace('<', '*') 
'fowiejf*woiefjweF*woeiufjweofj' 

爲什麼你使用re模塊這麼簡單的事情?您可以使用.replace方法。