2015-12-13 20 views
10

Kể từ khi re.sub() trả về toàn bộ chuỗi đã sửa đổi/chưa sửa đổi, có cách nào để kiểm tra xem re.sub() đã sửa đổi thành công văn bản mà không tìm kiếm kết quả của re.sub() không?Làm thế nào để kiểm tra xem re.sub() đã thay thế thành công trong python chưa?

+0

Tại sao nó không thay thế chính xác. Bạn có thể kiểm tra chuỗi cho regex bằng 're.match()' trước khi bạn muốn biết nếu có bất kỳ kết quả khớp nào bên trong. – nipeco

+0

Tôi cho rằng câu hỏi có nghĩa là: "làm thế nào bạn có thể biết liệu re.sub() có thay thế hay không" – Jon

+0

Bạn đang thực sự cố gắng làm gì? –

Trả lời

3

Nếu bạn có đoạn mã sau:

import re 
s1 = "aaa" 
result = re.sub("a", "b", s1) 

Bạn có thể kiểm tra xem các cuộc gọi đến phụ làm subsitutions bằng cách so sánh id của kết quả để S1 như vậy:

id(s1) == id(result) 

hay, đó là giống nhau:

s1 is result 

Điều này là do các chuỗi trong python là không thay đổi, vì vậy nếu có bất kỳ thay thế nào e thực hiện, kết quả sẽ là một chuỗi khác với gốc (ví dụ: chuỗi gốc không đổi). Lợi thế của việc sử dụng các id để so sánh hơn là nội dung của các chuỗi là so sánh là thời gian không đổi thay vì tuyến tính.

+2

Không thể hiểu được downvotes. Tôi xác nhận điều này để làm việc. Điều này thậm chí còn được ghi lại: "Nếu không tìm thấy mẫu, chuỗi được trả về không thay đổi". Vâng, nó không rõ ràng nói "cùng một đối tượng", vì vậy nó _might_ phá vỡ đôi khi, nhưng nếu OP là chết đặt trên tránh so sánh, đây là tốt nhất chúng tôi có thể cung cấp. –

+1

're.sub (s1," a "," b ")' không có ý nghĩa trong ngữ cảnh câu trả lời của bạn –

+1

Padric, cảm ơn tôi đã thay đổi câu trả lời để phản ánh điều này – Jon

8

Bạn có thể sử dụng re.subn mà thực hiện các hoạt động tương tự như sub(), nhưng trả về một tuple (new_string, number_of_subs_made)

Nếu số sửa đổi là 0 ví dụ: chuỗi không được sửa đổi.

>>> re.subn('(xx)+', '', 'abcdab') 
('abcdab', 0) 
>>> re.subn('(ab)+', '', 'abcdab') 
('cd', 2) 
>>> 
+0

Cảm ơn Praveen, điều này cung cấp thông tin về sửa đổi. –

Các vấn đề liên quan