2016-03-30 20 views
1

の交換:私はfolowing表現持つ複数の類似文字列に

a = 'x11 + x111 + x1111 + x1' 

と、私は次のように交換したいと思います:

anew = 'x22 + x333 + x3333 + x2' 

from_ = ['1', '11', '111', '1111'] 
to = ['2', '22', '333', '3333'] 

そのためには、次の結果を得ますどうすればPythonを使ってこれを行うことができますか?

これは、Python replace multiple stringsと同様の質問です。しかし、私の場合、置換された値は、質問で提案されたアンワーサーを使用すると、それ自体が過大になっています。したがって、多値置換を行う必要がある場合には、reライブラリ(正規表現)からの

答えて

1

​​の結果が得られます。

re.subは、関数の追加引数を取ります。この関数では、必要な変更を加えることができます。ドキュメントから

re.sub(pattern, repl, string, count=0, flags=0) 

replが関数である場合には、パターンのすべての非重複 発生のために呼ばれています。この関数は、単一一致オブジェクト 引数を取り、 置換文字列を返します。

(強調鉱山)が

ここでは、正規表現、すなわち、あなたが数字のすべてのグループに一致していることを意味し\d+簡単です。

あなたが希望する出力

import re 

a = 'x11 + x111 + x1111 + x1' 

def substitute(matched_obj): 
    from_ = ['1', '11', '111', '1111'] 
    to = ['2', '22', '333', '3333'] 
    part = matched_obj.group(0) 
    if part in from_: 
     return to[from_.index(part)] 
    return part 

anew = re.sub(r'\d+',substitute,a) 

を取得するために、次のコードスニペットを利用することができ、プログラムを実行した後anewの値が予想される答えであるx22 + x333 + x3333 + x2になります。 `

+0

ありがとう@wim for the edit –

+0

問題ありません。私が言いたいことを考慮していない失敗モードがあります。入力 'a =' x12 ''、出力は '' x22 ''でなければなりませんが、貪欲な正規表現のために '' x12 ' ' – wim

+0

@wimそれに言及してくれてありがとう。私はそれをできるだけ早く正しいものにしようとします。 (私が既にベッド315AMにいるので、24時間以内に、それをATMにすることはできません)。再度、感謝します。 –

関連する問題