2015-07-14 30 views
7

en Böyle bir dize var diyelimbir dizede tek tek kelimeler etrafında parantez nasıl kaldırılır

'(Xyz_lk some stuff XYZ_l) (and even more stuff XyZ)' 

Bunu Python'da nasıl yaparım? Şimdiye kadar sadece

'(some stuff) (and even more stuff)' 

verir

re.sub('\(\w+\)', '', s) 

nasıl sadece parantez içinde kaldırmak ve içlerinde metin tutabilir kullanarak metin ile bunları birlikte kaldırmak başardı?

cevap

15
re.sub(r'\((\w+)\)',r'\1',s) 

\1 veya geri verilemeyi kullanın.

+0

Teşekkürler, iyi çalışıyor! Kasra cevabında \ b kullanır. Kullanmamanın bir sebebi var mı? Cevabım yanı sıra iyi çalışıyor. – Cleb

+1

@Cleb, '\ b' kelime sınırıdır ve '\ w 'kelimelerin sadece eşleşeceği ve'()' etrafında olması gerektiği için ihtiyacımız yoktur. Bu yüzden hiç ihtiyacımız yok – vks

+0

Tamam, açıklama için teşekkürler. \ 1'in nasıl çalıştığını düşünür müsün? Bu konuda fazla deneyimim yok ... – Cleb

5

geri-başvuru kullanabilirsiniz (aslında sub işlevinde onlar grup referans numaraları denir):

>>> s='((Xyz_lk) some stuff (XYZ_l)) (and even more stuff (XyZ))' 
>>> 
>>> re.sub(r'\((\w+)\)',r'\1',s) 
'(Xyz_lk some stuff XYZ_l) (and even more stuff XyZ)' 
>>> 

fazla bilgi için http://www.regular-expressions.info/backref.html gelen geribaşvuruların hakkında şu açıklamayı okuyun:

geribaşvuruların maç Bir yakalama grubu tarafından daha önce eşleştirildiği gibi aynı metin. Bir çift açılış ve kapanış HTML etiketini ve aradaki metni eşleştirmek istediğinizi varsayalım. Açılış etiketini bir arka plana yerleştirerek, kapanış etiketinin etiketinin adını yeniden kullanabiliriz. İşte nasıl: <([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>. Bu regex, [A-Z][A-Z0-9]* ile eşleşen dizeyi yakalayan yalnızca bir çift parantez içerir. Bu açılış HTML etiketidir. (HTML etiketleri büyük/küçük harfe duyarsız olduğundan, bu regex büyük/küçük harfe duyarsız eşleşme gerektirir.) Geri tepme noktası \1 (ters eğik çizgi) ilk yakalama grubuna işaret eder. \1, ilk yakalama grubuyla eşleşen aynı metinle eşleşir. Önceden bir harf olan /. Eşleştirmeye çalıştığımız kapanış HTML etiketindeki basit eğik çizgidir.

+0

Teşekkürler! İyi çalışıyor. \ N neden gereklidir? Vks 'cevabında onlar dahil değildir. Bunun için herhangi bir sebep var mı? Soruyu cevapladığından beri cevabı kabul ediyorum. – Cleb

+0

'\ w' nin niteliğinden ötürü, sınırlar gereksizdir, yani sınırların regex'e dahil edilip edilmediği de aynı olacaktır. Ancak, genel olarak bunları kullanmak iyidir. @Cleb, 'pydoc re':' \ b - Boş dizgeyle eşleşir, ancak sadece bir kelimenin başlangıcında veya sonunda. ' – werkritter

+0

@Cleb Kısacası, sözcük sınırları, regex motorunuzu yalnızca birleştirilmiş olan karakterlerle eşleşmeye zorladı Bu durumda regex tarafından yapılan daha fazla http://www.regular-expressions.info/wordboundaries.html werkritter haklıdır bu durumda kelime sınırına ihtiyacınız yok – Kasramvd

İlgili konular