python re.sub nhóm: số sau \ số


183

Làm thế nào tôi có thể thay thế foobarbằng foo123bar?

Điều này không hoạt động:

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

Những công việc này:

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

Tôi nghĩ đó là một vấn đề phổ biến khi có một cái gì đó như \number. Bất cứ ai có thể cho tôi một gợi ý về cách xử lý này?


2
Câu hỏi này đã được thêm vào Câu hỏi thường gặp về Biểu thức thường xuyên chồng chéo , trong phần "Nhóm".
aliteralmind

1
câu hỏi này khiến tôi mất khá nhiều thời gian để tìm, bởi vì nó không có các thuật ngữ 'nhóm bắt giữ' hoặc 'tham chiếu nhóm được đánh số', nhưng cuối cùng tôi cũng đến đây và rất vui vì bạn đã hỏi nó.
Đánh dấu

1
Vấn đề của bạn là r '\ 112' đang được hiểu là số bát phân 0112, ASCII'J 'hoặc số thập phân 74. Không thể xem cách buộc phản hồi' \ 1 'để được đánh giá trước khi nối chuỗi hoặc''.join()
smci

một sai lệch nhỏ so với câu hỏi, có cách nào để giới thiệu tất cả các trận đấu nhóm hay không, ví dụ r '\ <cho tất cả các trận đấu> hi'?
Sayan Dey

Câu trả lời:


313

Câu trả lời là:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

Đoạn trích liên quan từ các tài liệu:

Ngoài các ký tự thoát và phản hồi như được mô tả ở trên, \ g sẽ sử dụng chuỗi con khớp với tên có tên của nhóm, như được xác định bởi cú pháp (? P ...). \ g sử dụng số nhóm tương ứng; Do đó, \ g <2> tương đương với \ 2, nhưng không mơ hồ trong một thay thế, chẳng hạn như \ g <2> 0. \ 20 sẽ được hiểu là một tham chiếu đến nhóm 20, không phải là một tham chiếu đến nhóm 2 theo sau là ký tự chữ '0'. Sự thay thế \ g <0> thay thế trong toàn bộ chuỗi con được khớp với RE.


48
Đừng quá khó khăn với chính mình. Nó bị chôn vùi trong tài liệu sâu đến mức sẽ khiến hầu hết mọi người mất nhiều thời gian hơn để đọc tài liệu hơn là google câu hỏi của họ và câu trả lời này xuất hiện trên SO.
siêu tốc độ

1
Báo giá chính xác được cung cấp được tìm thấy ở đây trong trường hợp bạn đang tìm kiếm bối cảnh
patrick

Tôi có thể lấy nhóm và sửa đổi nó không? \ g <1> ... Ví dụ trong trường hợp này g <1> là foo, nhưng tôi muốn thay đổi o bởi u, như "fuu" này
Eric Bellet
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.