Python Regex ngay lập tức thay thế các nhóm


106

Có cách nào để thay thế trực tiếp tất cả các nhóm bằng cú pháp regex không?

Cách bình thường:

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

Nhưng tôi muốn đạt được điều gì đó như thế này:

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

Tôi muốn xây dựng chuỗi mới ngay lập tức từ các nhóm mà Regex vừa bắt.

Câu trả lời:


189

Hãy xem re.sub:

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

Đây là hàm thay thế (thay thế) regex của Python. Chuỗi thay thế có thể được lấp đầy bằng cái gọi là dấu gạch chéo ngược (dấu gạch chéo ngược, số nhóm) được thay thế bằng những gì được khớp bởi các nhóm. Các nhóm được đếm giống như theo group(...)hàm, tức là bắt đầu từ 1, từ trái sang phải, bằng cách mở ngoặc đơn.


4
Cách rõ ràng hơn so với tài liệu! Không hiểu nhóm đã làm việc với cái này như thế nào. Họ nên thêm ví dụ như vậy.
Y0da

nó hoạt động ngay từ lần đầu tiên, Đây là một cách giải thích rõ ràng về nó. Cảm ơn và bạn có thể giải thích nhóm phụ nên gọi như thế nào trong (r(r))r((r)((r)r))tình huống kinda đúng không?
Rakshitha Muranga Rodrigo

1
@RakshithaMurangaRodrigo Các nhóm được đánh số từ trái sang phải, theo vị trí bắt đầu. Vì vậy, nếu tôi chèn đúng số của mỗi nhóm trước của nhóm, họ sẽ được sắp xếp: 1(r2(r))r3(4(r)5(6(r)r)).
Martin Ender

@MartinEnder: Cảm ơn rất nhiều!
Rakshitha Muranga Rodrigo 14/1218

30

Câu trả lời được chấp nhận là hoàn hảo. Tôi sẽ thêm rằng tham chiếu nhóm có thể đạt được tốt hơn bằng cách sử dụng cú pháp này:

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

cho chuỗi thay thế. Bằng cách này, bạn giải quyết các giới hạn cú pháp trong đó một nhóm có thể được theo sau bởi một chữ số. Một lần nữa, tất cả điều này đều có trong tài liệu, không có gì mới, chỉ là đôi khi khó nhận ra ngay từ cái nhìn đầu tiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.