2017-02-08 11 views
5

Diğer tüm karakterleri el değmeden tutarken, dize iki öğeyi değiştirmeye çalışıyorum. İşte bir örnek:Python RegEx kullanarak dizedeki iki öğe nasıl değiştirilir?

Orijinal dize:

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

Gerekli çıkışı: A * ve B * bundan sonra eleman kapatılmayacağını

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

dikkat edin. Ben gerekli dize almak için alt nasıl kullanılacağını öğrenmek için yardımına ihtiyacım Bu aşamadan sonra

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

:

aşağıdaki gibi yerine bana unsurları veren bir RegEx desen derlemek başardı.

cevap

8

Seçeneklerden biri de iki ilgilenen desenleri arasındaki desen yakalamak ve bunları yeniden düzenlemek için başvuru geri kullanmaktır:

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

Tatlı manevra! – MYGz

+0

Teşekkür ederiz @Psidom. Keşke bu çözümü düşündüm. – harshal1618

1

Alternatif olarak, aynı zamanda bulmak dize ile bu çözmek ve bunun yerine normal ifadelerin bir döngü olabilir :

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