2012-02-26 9 views
4

re.subのリストを使用して置換を実行する最善の方法は何ですか?たとえば:re.subでリストの要素を置換しますか?

import re 

some_text = '[email protected]@[email protected]' 
substitutions = ['ONE', 'TWO', 'THREE'] 
x = re.sub('@', lambda i: i[0] substitutions.pop(0), some_text) # this doesn't actually work 

所望の出力は次のようになります。

some_text = 'xxxxxxxONEyyyyyyyyyTWOzzzzzzzzzTHREE' 
+0

このコードを実行したときに実際にエラーが発生した場合は、構文エラーがどこにあるかを_precisely_が指摘しています。 – katrielalex

答えて

5

あなたは自分のラムダに構文エラーがあります:ODEははほとんど正しい、それは構文エラーのわずかな修正を必要とされますが、変更したくない場合は

>>> substitutions = ['ONE', 'TWO', 'THREE'] 
>>> re.sub('@', lambda _: substitutions.pop(0), some_text) 
'xxxxxxxONEyyyyyyyyyTWOzzzzzzzzzTHREE' 

リストには、iterableをラップすることができます。

>>> substitutions = ['ONE', 'TWO', 'THREE'] 
>>> subs = iter(substitutions) 
>>> re.sub('@', lambda _: next(subs), some_text) 
'xxxxxxxONEyyyyyyyyyTWOzzzzzzzzzTHREE' 
1

一つの方法は、(1、より良いが、おそらくそこだ、私は本当にのPythonを知らない)正規表現をコンパイルすることです、そして、それを使用します代わりsub

import re 

some_text = '[email protected]@[email protected]' 
substitutions = ['ONE', 'TWO', 'THREE'] 
pattern = re.compile('@') 
x = pattern.sub(lambda i: substitutions.pop(0), some_text) 

Here's a demo.

関連する問題