Xử lý các tham chiếu ngược để chụp các nhóm trong mẫu thay thế re.sub


86

Tôi muốn lấy chuỗi 0.71331, 52.25378và trả về 0.71331,52.25378- tức là chỉ cần tìm một chữ số, một dấu phẩy, một khoảng trắng và một chữ số, và loại bỏ khoảng trắng.

Đây là mã hiện tại của tôi:

coords = '0.71331, 52.25378'
coord_re = re.sub("(\d), (\d)", "\1,\2", coords)
print coord_re

Nhưng điều này mang lại cho tôi 0.7133,2.25378. Tôi đang làm gì sai?


4
Kể từ khi bạn không thực sự muốn chụp các chữ số, nó có thể làm cho ý nghĩa hơn để sử dụng nhìn quanh, ví dụ: re.sub(r'(?<=\d), (?=\d)', ',', coords).
ig0774,

1
Câu hỏi cụ thể này không cần regex, hãy sử dụng thay thế: coords.replace(' ', '')
Gringo Suave

Câu trả lời:


116

Bạn nên sử dụng chuỗi thô cho regex, hãy thử những cách sau:

coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)

Với mã hiện tại của bạn, các dấu gạch chéo ngược trong chuỗi thay thế của bạn đang thoát các chữ số, vì vậy bạn đang thay thế tất cả các kết quả khớp tương đương với chr(1) + "," + chr(2):

>>> '\1,\2'
'\x01,\x02'
>>> print '\1,\2'
,
>>> print r'\1,\2'   # this is what you actually want
\1,\2

Bất kỳ lúc nào bạn muốn để lại dấu gạch chéo ngược trong chuỗi, hãy sử dụng rtiền tố hoặc thoát từng dấu gạch chéo ngược ( \\1,\\2).


2
Cảm ơn, đó là thủ thuật. docs.python.org/library/re.html#raw-string-notation cho bất kỳ ai đọc này.
Richard

1
Ngoài ra stackoverflow.com/questions/2081640/… để được giải thích rõ hơn về chuỗi thô là gì.
Richard

Làm thế nào bạn thực sự sẽ in tên nhóm trong ví dụ trên? Nói, nếu nhóm \1được gọi xCoord , là nó có thể hướng dẫn re.subđể thay thế các dây phụ với tên nhóm như vậy mà re.sub(r"(\d), (\d)", r"\1,\2", coords)kết quả là chuỗi chữxCoord,52.25378
zelusp

Điều này không hoạt động trong Python3. Sử dụng \1thay thế nó bằng một số ký tự unicode kỳ lạ.
Cerin

15

Python diễn giải \1ký tự như một ký tự có giá trị ASCII 1 và chuyển nó sang sub.

Sử dụng các chuỗi thô, trong đó Python không diễn giải \.

coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)

Điều này được đề cập ngay trong phần đầu của retài liệu , nếu bạn cần thêm thông tin.

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.