Python Regex grupları anında değiştirin


108

Normal ifade sözdizimini kullanarak tüm grupları doğrudan değiştirmenin bir yolu var mı?

Normal yol:

re.match(r"(?:aaa)(_bbb)", string1).group(1)

Ama bunun gibi bir şey başarmak istiyorum:

re.match(r"(\d.*?)\s(\d.*?)", "(CALL_GROUP_1) (CALL_GROUP_2)")

Yeni dizgiyi, Regex'in yakaladığı gruplardan anında oluşturmak istiyorum.

Yanıtlar:


191

Şunlara bir göz atın re.sub:

result = re.sub(r"(\d.*?)\s(\d.*?)", r"\1 \2", string1)

Bu, Python'un düzenli ifade değiştirme (değiştirme) işlevidir. Yerini alan dizge, gruplar tarafından eşleşenlerle değiştirilen sözde geri referanslarla (ters eğik çizgi, grup numarası) doldurulabilir. Gruplar, group(...)işleve göre, yani 1soldan sağa, parantez açılarak sayılır .


4
Doktordan çok daha net! Grubun bununla nasıl çalıştığını anlamadım. Böyle bir örnek eklemeliler.
Y0da

ilk andan itibaren işe yaradı. Bu, bunu açıklamanın oldukça açık ve net bir yolu. Teşekkürler ve alt grubun nasıl uygun şekilde araması gerektiğini açıklayabilir misiniz (r(r))r((r)((r)r))?
Rakshitha Muranga Rodrigo

1
@RakshithaMurangaRodrigo Gruplar başladıkları yere göre soldan sağa doğru numaralandırılır. Ben grubun önünde her grubun sayısı hakkını eklemek Yani, onlar sıralanabilir ediyorum: 1(r2(r))r3(4(r)5(6(r)r)).
Martin Ender

30

Kabul edilen cevap mükemmel. Grup referansına muhtemelen bu sözdizimini kullanarak daha iyi ulaşılacağını ekleyeceğim:

r"\g<1> \g<2>"

yedek dize için. Bu şekilde, bir grubun ardından bir rakam gelebileceği sözdizimi sınırlamalarını aşarsınız. Yine, bunların hepsi belgede mevcut, yeni bir şey değil, bazen ilk bakışta fark edilmesi zor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.