Tìm lần xuất hiện cuối cùng của chuỗi con trong chuỗi, thay thế chuỗi đó


104

Vì vậy, tôi có một danh sách dài các chuỗi có cùng định dạng và tôi muốn tìm dấu "." trong mỗi ký tự và thay thế nó bằng ". -". Tôi đã thử sử dụng rfind, nhưng dường như tôi không thể sử dụng nó đúng cách để làm điều này.


Câu trả lời:


163

Điều này nên làm điều đó

old_string = "this is going to have a full stop. some written sstuff!"
k = old_string.rfind(".")
new_string = old_string[:k] + ". - " + old_string[k+1:]

1
Cảm ơn rất nhiều người đàn ông. Sẽ phải nghiên cứu điều đó trong một phút ... đây là sử dụng các lát cắt, phải không?
Adam Magyar,

@AdamMagyar vâng, vùng chứa [a: b] cắt từ chỉ mục lên đến b-1 của vùng chứa. Nếu 'a' bị bỏ qua, thì nó mặc định là 0; nếu bỏ qua 'b' thì mặc định là len (container). Toán tử cộng chỉ nối. Hàm rfind như bạn đã chỉ ra trả về chỉ mục mà hoạt động thay thế sẽ diễn ra.
Aditya Sihag

26

Để thay thế từ bên phải:

def replace_right(source, target, replacement, replacements=None):
    return replacement.join(source.rsplit(target, replacements))

Đang sử dụng:

>>> replace_right("asd.asd.asd.", ".", ". -", 1)
'asd.asd.asd. -'

1
Tôi chắc chắn thích giải pháp này nhưng có replacements=Nonetham số dường như là một lỗi đối với tôi bởi vì nếu tham số bị bỏ qua, hàm sẽ báo lỗi (đã thử trong Python 2.7). Tôi sẽ đề xuất loại bỏ giá trị mặc định, đặt nó thành -1 (để thay thế không giới hạn) hoặc tốt hơn là làm cho nó replacements=1(mà tôi nghĩ nên là hành vi mặc định cho chức năng cụ thể này theo những gì OP muốn). Theo tài liệu , tham số này là tùy chọn, nhưng nó phải là một int nếu được cung cấp.
commentov

Trong trường hợp bất cứ ai muốn một lớp lót cho việc này: ". -".join("asd.asd.asd.".rsplit(".", 1)). Tất cả những gì bạn đang làm là thực hiện tách chuỗi từ phía bên phải cho 1 lần xuất hiện và nối lại chuỗi bằng cách sử dụng thay thế.
bsplosion

14

Tôi sẽ sử dụng một regex:

import re
new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list]

2
Đây là câu trả lời duy nhất hoạt động nếu không có dấu chấm nào cả. Tôi muốn sử dụng một lookahead mặc dù:\.(?=[^.]*$)
Georg

6

Một lớp lót sẽ là:

str=str[::-1].replace(".",".-",1)[::-1]


1
Điều này là sai lầm . Bạn đang đảo ngược chuỗi, thay thế nó và sau đó đảo ngược lại. Bạn đang làm .replacetrên một chuỗi đảo ngược. Cả hai chuỗi đã qua replacecũng phải được đảo ngược. Nếu không, khi bạn đảo ngược chuỗi lần thứ hai, các chữ cái bạn vừa chèn sẽ bị ngược lại. Bạn chỉ có thể sử dụng điều này nếu bạn đang thay thế một chữ cái bằng một chữ cái, và thậm chí sau đó tôi sẽ không đưa nó vào mã của bạn trong trường hợp ai đó phải thay đổi nó trong tương lai và bắt đầu tự hỏi tại sao một từ được viết sdrawkcab.
Boris

1

Bạn có thể sử dụng hàm bên dưới để thay thế lần xuất hiện đầu tiên của từ bên phải.

def replace_from_right(text: str, original_text: str, new_text: str) -> str:
    """ Replace first occurrence of original_text by new_text. """
    return text[::-1].replace(original_text[::-1], new_text[::-1], 1)[::-1]

0
a = "A long string with a . in the middle ending with ."

# nếu bạn muốn tìm chỉ mục của lần xuất hiện cuối cùng của bất kỳ chuỗi nào, Trong trường hợp của chúng tôi, chúng tôi # sẽ tìm chỉ mục của lần xuất hiện cuối cùng của với

index = a.rfind("with") 

# kết quả sẽ là 44, vì chỉ mục bắt đầu từ 0.


-1

Cách tiếp cận ngây thơ:

a = "A long string with a . in the middle ending with ."
fchar = '.'
rchar = '. -'
a[::-1].replace(fchar, rchar[::-1], 1)[::-1]

Out[2]: 'A long string with a . in the middle ending with . -'

Câu trả lời của Aditya Sihag chỉ với một câu rfind:

pos = a.rfind('.')
a[:pos] + '. -' + a[pos+1:]

Điều này cũng đảo ngược chuỗi thay thế. Ngoài ra, nó là sự lặp lại câu trả lời của root, và như tôi đã nói ở đó, khá kém hiệu quả.
Gareth Latty

@Lattyware Bạn có nghĩa là nó đảo ngược a?
Alex L

Tôi có nghĩa là nó đảo ngược '. -'trong đầu ra.
Gareth Latty

Chỉ mong đợi người dùng đảo ngược chuỗi theo nghĩa đen bằng tay không phải là một ý tưởng tuyệt vời - nó dễ mắc sai lầm và không rõ ràng.
Gareth Latty

@Lattyware Đồng ý. Tôi đã biến nó thành một var. (Tôi nhận ra đó là một phương pháp hiệu quả, và không phù hợp trong mọi trường hợp - bạn replace_rightcó nhiều đẹp hơn)
Alex L
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.