2012-03-30 64 views
35

Tôi muốn làm một chuỗi thay thế bằng Python, nhưng chỉ làm ví dụ đầu tiên đi từ phải sang trái. Trong một thế giới lý tưởng tôi muốn có:Chuỗi từ phải sang trái thay thế bằng Python?

myStr = "mississippi" 
print myStr.rreplace("iss","XXX",1) 

> missXXXippi 

Cách tốt nhất để làm điều này là gì, vì rreplace không tồn tại?

+6

: http://stackoverflow.com/q/2556108/989121 – georg

Trả lời

58

rsplitjoin thể được sử dụng để mô phỏng những ảnh hưởng của một rel rreplace

>>> 'XXX'.join('mississippi'.rsplit('iss', 1)) 
'missXXXippi' 
+5

+1 cho giải pháp dễ hiểu bởi các lập trình viên theo dõi. – strongMA

+0

+1 Đây là câu trả lời hay nhất! – uccie

+1

Ngược lại với các giải pháp khác, điều này cũng dễ dàng mở rộng để thực hiện nhiều thay thế từ bên phải. – Anaphory

20
>>> myStr[::-1].replace("iss"[::-1], "XXX"[::-1], 1)[::-1] 
'missXXXippi' 
+8

rằng như vậy là * không * người mới thân thiện ... :) – brice

+0

Tôi giả định điều này làm những gì @ sleeplessnerd của không nhưng không có 'đảo ngược'? – fredley

+0

@brice Nếu nó hoạt động tôi không quan tâm – fredley

0

Đây là loại hack bẩn, nhưng bạn có thể đảo ngược chuỗi và thay thế bằng các chuỗi đảo ngược.

"mississippi".reverse().replace('iss'.reverse(), 'XXX'.reverse(),1).reverse() 
+11

Không có phương thức 'reverse()' cho chuỗi. –

6

bạn có thể đảo ngược một chuỗi như vậy:

myStr[::-1] 

để thay thế chỉ cần thêm .replace:

print myStr[::-1].replace("iss","XXX",1) 

tuy nhiên bây giờ chuỗi của bạn là ngược, vì vậy lại đảo ngược nó:

myStr[::-1].replace("iss","XXX",1)[::-1] 

và bạn đã hoàn tất. Nếu chuỗi thay thế của bạn là tĩnh chỉ cần đảo ngược chúng trong tập tin để giảm chi phí. Nếu không, thủ thuật tương tự sẽ hoạt động.

myStr[::-1].replace("iss"[::-1],"XXX"[::-1],1)[::-1] 
+2

bạn quên đảo ngược văn bản phù hợp và văn bản thay thế – sleeplessnerd

+1

Không, tôi đã nói cuối cùng phải làm gì nếu bạn muốn chúng đảo ngược. – Serdalis

14
>>> re.sub(r'(.*)iss',r'\1XXX',myStr) 
'missXXXippi' 

Động cơ regex cosumes tất cả các chuỗi và sau đó bắt đầu thụt lùi cho đến khi iss được tìm thấy. Sau đó, nó thay thế chuỗi tìm thấy bằng mẫu cần thiết.


Một số tốc độ tests

Các giải pháp với [::-1] hóa ra là nhanh hơn.

Giải pháp với re chỉ nhanh hơn đối với các chuỗi dài (dài hơn 1 triệu ký hiệu).

+0

Điều này có hiệu quả hơn phương pháp đảo ngược cho các chuỗi ngắn (<20 ký tự) không? – fredley

+0

@TomMedley Tôi không biết. Tôi không làm bất kỳ bài kiểm tra tốc độ nào. Như tôi biết, backtracking khá chậm. Và nếu 'iss' ở đâu đó trong phần đầu của chuỗi, nó sẽ mất một thời gian để bracktrack cho đến khi động cơ tìm thấy một vị trí mà' iss' phù hợp. – ovgolovin

+0

@TomMedley Nhưng tôi không nghĩ rằng những '[:: - 1]' trong các giải pháp khác nhanh hơn :) – ovgolovin

2
def rreplace(s, old, new): 
    try: 
     place = s.rindex(old) 
     return ''.join((s[:place],new,s[place+len(old):])) 
    except ValueError: 
     return s 
Các vấn đề liên quan