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.
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:
Đ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:]
Để 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. -'
replacements=None
tham 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.
". -".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ế.
Tôi sẽ sử dụng một regex:
import re
new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list]
\.(?=[^.]*$)
Một lớp lót sẽ là:
str=str[::-1].replace(".",".-",1)[::-1]
.replace
trên một chuỗi đảo ngược. Cả hai chuỗi đã qua replace
cũ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.
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]
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.
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:]
a
?
'. -'
trong đầu ra.
replace_right
có nhiều đẹp hơn)