Python で、
str = '"1": "orange", "2":"lemon", "3":"apple"' alist = [ 'A', 'B', 'C' ]
このように str に対する正規表現 [a-z]+ にマッチする置換を
リスト alist で順に置換したい。
期待値は、、
"1": "A", "2":"B", "3":"C"
Python の正規表現・置換でここまで実現するには次の工夫が必要だ。
re.sub で、"{インデックス}" に変換して format 関数で置換するという手順にする。
sub に渡す replace 関数を置換するリストを指定することで提供するクラスを用意する。
import re class Replsequence(): def __init__(self, ary): self.n = -1 self.len = len(ary) def handle(self, m): self.n = self.n + 1 return '{%d}' % self.n if self.n < self.len else m.group()
実行
result = re.compile(r'[a-z]+').sub(Replsequence(alist).handle, str, re.MULTILINE).format(*alist) print(result) # "1": "A", "2":"B", "3":"C"
置換するリスト、Replsequence インスタンス生成で渡すリストが少ない場合、
alist = [ 'A', 'B' ]
の時は、3番目まで置換ではなく、2番目までの置換になり
"1": "A", "2":"B", "3":"apple"
となる。
ただし、注意が必要なのは、置換される元の文字列に、"{" , "}" が存在する場合は、
この方法が使用できない。
format関数に頼るからだ。