2017-08-04 10 views
1

私は修正したい特定の文字列を含むテキストファイルを持っています。たとえば、次の文字列では、fooとbarをそれぞれ一意の文字列に置き換えたいと考えています(新しい文字列は元々一致していたものに基づいているため、前もって知ることはできません)。Pythonで複数のアイテムをregexに置き換える

Original: foo text text bar text 
Replaced: fooNew text text bar_replaced text 

私は、彼らが実際のテキストで区切られている方法に基づいて変更する必要があるグループを見つけるために正規表現を使用しています。私がre.findAll()を使うだけでは、マッチしたグループを変更した後で、文字列内の単語の位置を文字列を再構成することができなくなりました。

各マッチを別々に変更している間に、文字列内の単語の位置を保持する方法はありますか?

+0

これをポストした直後に、re.findAll()の後にstr.replace()を使用することができたかもしれないことに気がつきましたが、すでに入力しているので誰でも良い方法があります。 – digitaLink

+0

には 're.sub 'を使わない理由がありますか? – asongtoruin

+0

検索文字列がハードコード文字列であり、文字列の照合時に考慮するコンテキストがない場合は、連鎖した 'replace'メソッドを使用してください。 –

答えて

2

オプション1

私は複雑なシナリオのためにこれをお勧めします。ここでre.subとソリューションとラムダコールバックです:はるかに簡単

In [1]: re.sub('foo|bar', lambda x: 'fooNew' if x.group() == 'foo' else 'bar_replaced', text) 
Out[1]: 'fooNew text text bar_replaced text' 

オプション2

、あなたは文字列をハードコードしている場合は、交換がstr.replaceで可能です:

In [2]: text.replace('foo', 'fooNew').replace('bar', 'bar_replaced') 
Out[2]: 'fooNew text text bar_replaced text' 
+0

「オプション1」では、任意の関数が新しい置換のためにlambda x:の後に行くことができますか? – digitaLink

+0

@digitaLink正確に。 –

関連する問題