Pythonで1つの大きな文字列に複数の文字列を置き換えるには、どのような方法が推奨されますか?

私は多くの文字列ペアと1つの大きな文字列(ファイルの内容です)を持っています。私は、各ペアの最初のメンバーのすべての出現をそれぞれの2番目のメンバーに置き換える必要があります。

たとえば、ペア(「AA」、「BB」)と(「qq」、「rt」)を持つ場合、 AA のすべての出現を BB qtrt です。

ペアの文字列はすべて一意なので、置換の順序は最終結果では関係ありません。

私のPythonコードは最も素朴です - 私はすべてのペアが使い果たされるまで、string.replaceメソッドを連続して適用します:

>>> s="frsfsdAAsdfvsdfvqqdsff"
>>> pairs=[('AA', 'BB'), ('qq', 'rt')]
>>> for p in pairs:
...   s=s.replace(p[0], p[1])
...
>>> s
'frsfsdBBsdfvsdfvrtdsff'
>>>

私はこれが大きな文字列のための悪い解決策であると信じています。誰かがより効率的なものを提案できますか?

問題は、Pythonでそれを行う方法です。

ありがとう。

4

1 答え

あなたの提案された解決策には何か間違いがあります:最初の置換が行われた後に結果の文字列が一致し、同じ文字が再び置換される可能性があります。たとえば、 pairs = [( 'qq'、 'qq')を設定して 'qq' と 'ff' をスワップしようとした場合、 ff ')、(' ff '、' qq ')]

代わりにこれを試すことができます:

>>> d = dict(pairs)
>>> import re
>>> pattern = re.compile('|'.join(re.escape(k) for k in d))
>>> pattern.sub(lambda k:d[k.group()], s))
frsfsdBBsdfvsdfvrtdsff
3
追加された
私は質問に明記しましたが、私は次のように述べています。ペアの文字列はすべて一意なので、置換の順序は最終結果には関係ありません。前提条件はまだ成り立ちます - すべての文字列はユニークです。
追加された 著者 mark,
何故ですか? string.replace は、 'mmmAAmmmmAAmmmAA'.replace(' AA '、' BB ')==' mmmBBmmmmBBmmmBB 'True
追加された 著者 mark,
私は今、それを得ると思う、置換文字列と他の文字の組み合わせは、新しい文字列を生成し、それが置き換えられます。良いキャッチ、ありがとう。
追加された 著者 mark,
@マーク:それはまったく違いはありません。あなたのソリューションはまだ動作しません。すべての文字列が一意であるが、期待される結果を得るためにあなたのソリューションはまだ失敗する という別の例を簡単に見つけることができます。
追加された 著者 Mark Byers,