2017-02-08 3 views
5

文字列内の2つの要素を切り替えようとしていますが、ほかのすべての文字は変更しません。次に例を示します。Python RegExを使用して文字列内の2つの要素を切り替える方法は?

オリジナルの文字列:

r'xyzA*12*pqR*stB*HS*lmN*opA*45*a4N*gB*SD*drtU*ghy' 

必要な出力:*とB *後の要素が切り替わっていることを

r'xyzA*HS*pqR*stB*12*lmN*opA*SD*a4N*gB*45*drtU*ghy' 

注意してください。私は必要な文字列を取得するために、サブを使用する方法を見つけるためにあなたの助けを必要とし、この段階の後

>>> import re 
>>> pattern = re.compile(r'A\*(.*?)\*.*?B\*(.*?)\*') 
>>> M = pattern.findall(string) 
>>> M 
[('12', 'HS'), ('45', 'SD')] 

は、私は次のように置き換えるために私に要素を与える正規表現パターンをコンパイルすることができました。

答えて

8

1つのオプションは、同様2つの興味のパターン間のパターンをキャプチャし、それらを並べ替えるための基準をバック使用することです:

s = r'xyzA*12*pqR*stB*HS*lmN*opA*45*a4N*gB*SD*drtU*ghy' 

import re 
pattern = re.compile(r'A\*(.*?)(\*.*?B\*)(.*?)\*') 

#keep the position of the second group and switch the position of the first and third group 
pattern.sub(r"A*\3\2\1*", s) 
# 'xyzA*HS*pqR*stB*12*lmN*opA*SD*a4N*gB*45*drtU*ghy' 
+1

スウィートマヌーバ! – MYGz

+0

@Psidomありがとうございます。私はこの解決策を考えていたと思います。 – harshal1618

1

また、あなたはまた、文字列の検索、代わりに正規表現のループでこれを解決できます:

str = r'xyzA*12*pqR*stB*HS*lmN*opA*45*a4N*gB*SD*drtU*ghy' 
result = "" 
start = 0 
while (str.find("A*", start) > -1): 
     aStart = str.find("A*", start)+2 
     aEnd = str.find("*", aStart) 
     bStart = str.find("B*", aEnd)+2 
     bEnd = str.find("*", bStart) 
     result += str[start:aStart]+str[bStart:bEnd]+str[aEnd:bStart]+str[aStart:aEnd] 
     start = bEnd 
result += str[start:] 

print result 
#xyzA*HS*pqR*stB*12*lmN*opA*SD*a4N*gB*45*drtU*ghy 
関連する問題