Python Regex langsung menggantikan grup

106

Apakah ada cara untuk mengganti semua grup secara langsung menggunakan sintaks regex?

Cara normal:

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

Tetapi saya ingin mencapai sesuatu seperti ini:

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

Saya ingin membangun string baru secara instan dari grup yang baru saja ditangkap Regex.

mc_kaiser
sumber

Jawaban:

189

Lihat di re.sub:

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

Ini adalah fungsi substitusi (ganti) regex Python. String pengganti dapat diisi dengan apa yang disebut backreferences (garis miring terbalik, nomor grup) yang diganti dengan apa yang dicocokkan oleh grup. Grup dihitung sama dengan group(...)fungsinya, yaitu mulai dari 1, dari kiri ke kanan, dengan membuka tanda kurung.

Martin Ender
sumber
4
Jauh lebih jelas daripada dok! Tidak mengerti bagaimana kelompok bekerja dengan yang satu ini. Mereka harus menambahkan contoh seperti itu.
Y0da
itu berhasil sejak pertama kali, Ini adalah cara jelas yang cukup bagus untuk menjelaskannya. Terima kasih dan dapatkah Anda menjelaskan bagaimana subkelompok harus menelepon dalam (r(r))r((r)((r)r))situasi yang agak tepat ?
Rakshitha Muranga Rodrigo
1
@RakshithaMurangaRodrigo Grup diberi nomor dari kiri ke kanan, mengikuti tempat mereka memulai. Jadi jika saya memasukkan nomor masing-masing kelompok tepat di depan kelompok, mereka akan diurutkan: 1(r2(r))r3(4(r)5(6(r)r)).
Martin Ender
@MartinEnder: Terima kasih banyak!
Rakshitha Muranga Rodrigo
30

Jawaban yang diterima sempurna. Saya akan menambahkan bahwa referensi grup mungkin lebih baik dicapai dengan menggunakan sintaks ini:

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

untuk string pengganti. Dengan cara ini, Anda mengatasi batasan sintaks di mana grup dapat diikuti oleh digit. Sekali lagi, ini semua ada di dokumen, tidak ada yang baru, hanya terkadang sulit dikenali pada pandangan pertama.

benelgiac.dll
sumber