我需要檢查列表「listb」中的字符串,用「*」替換字符「<」。用Python正則表達式替換爲「*」
我想是這樣的:
import re
for i in listb:
i = re.sub('\<','\*', 0)
但我不斷收到類型錯誤:預期的字符串或緩衝區。
不知道我在做什麼錯誤和網上的例子沒有太大的幫助。
我需要檢查列表「listb」中的字符串,用「*」替換字符「<」。用Python正則表達式替換爲「*」
我想是這樣的:
import re
for i in listb:
i = re.sub('\<','\*', 0)
但我不斷收到類型錯誤:預期的字符串或緩衝區。
不知道我在做什麼錯誤和網上的例子沒有太大的幫助。
見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。
>>> my_string = 'fowiejf<woiefjweF<woeiufjweofj'
>>> my_string.replace('<', '*')
'fowiejf*woiefjweF*woeiufjweofj'
爲什麼你使用re模塊這麼簡單的事情?您可以使用.replace
方法。
這可以在一行上的列表理解中完成:'listb = [re.sub(r'<',r'*',i)for i in listb]'。這樣可以避免創建新的列表名稱,也可以避免重複遍歷索引。 – SethMMorton
@SethMMorton是的,這是一個更好,更pythonic的方式來做到這一點。儘管如此,我想讓它儘可能接近他的原始代碼。我會將您的評論添加到我的答案中以獲得完整性。謝謝! – vroomfondel
非常感謝,解決了問題。然而,我無法相信我看過的每個教程都說re.sub中的最後一個參數是應該進行替換的次數,「0」是無限的。此外,我會邏輯地期望,子實際上是替代,改變了原來的價值。謝謝你清理那個。 – user2684432