2017-08-14 6 views
0

私の文字列には()が入ります。私がする必要があるのは、かっこの間のテキストを変更することです。Pythonの()間のテキストを置き換えます

例文字列:"B.TECH(CS,IT)"。私はこのような何かに括弧内のコンテンツの存在を変更する必要が私の文字列で ... B.TECH(ECE,EEE)

次のように私はこの問題を解決しようとしたことは..です

reg = r'(()([\s\S]*?)())' 
a = 'B.TECH(CS,IT)' 
re.sub(reg,"(ECE,EEE)",a) 

しかし、私はこのような出力を得ました..

'(ECE,EEE)B(ECE,EEE).(ECE,EEE)T(ECE,EEE)E(ECE,EEE)C(ECE,EEE)H(ECE,EEE)((ECE,EEE)C(ECE,EEE)S(ECE,EEE),(ECE,EEE)I(ECE,EEE)T(ECE,EEE))(ECE,EEE)' 

有効な出力は次のようにする必要があります。..

B.TECH(CS,IT) 

どこに行方が間違っていて、テキストを正しく置き換える方法。

+3

リテラルトークンとして使用したい場所で()をエスケープしてみます。例: '\(([\ s \ S] *)\)'。 '('と ')'は文字をグループ化しているため、正規表現演算子ではなくリテラルトークンであることを明示的に述べる必要があります。 – rubenwardy

+2

regex101.comなどを試しましたか?それはあなたにexectの結果を示し、あなたのregex-magicの呪文も '説明します'。あなたはあなたの()文字をエスケープする必要があるので、それはグループからそれを伝えます – sudo97

答えて

3

問題は、RegExで別の意味を持つ括弧を使用していることです。それらはグループ化文字として使用され、出力をキャッチします。

リテラルトークンとして使用したいところで、()をエスケープする必要があります。バックスラッシュ文字:\(を使用して文字をエスケープできます。ここで

は一例です:

reg = r'\([\s\S]*\)' 
a = 'B.TECH(CS,IT)' 
re.sub(reg, '(ECE,EEE)', a) 
# == 'B.TECH(ECE,EEE)' 
3

あなたが正規表現でメタ文字とみなされている括弧を、一致しようとしているので、あなたの正規表現が動作しない理由はあります。 ()は実際にはヌル文字列を取り込み、置き換えようとします。だからこそあなたはあなたが見える出力を得ることができます。

これを修正するには、これらの括弧をエスケープする必要があります -

\(...\) 

の線に沿って何かを、あなたの特定のユースケースでは、私はシンプルなパターンを提案するかもしれませんか?

In [268]: re.sub(r'\(.*?\)', '(ECE,EEE)', 'B.TECH(CS,IT)') 
Out[268]: 'B.TECH(ECE,EEE)' 
関連する問題