Python 正在查找字符串中最后出现的子字符串,并替换该子字符串

Python 正在查找字符串中最后出现的子字符串,并替换该子字符串,python,string,parsing,Python,String,Parsing,因此,我有一长串相同格式的字符串,我想在每个字符串中找到最后一个“.”字符,并用“.”-替换它。我尝试过使用rfind,但似乎无法正确地使用它来完成此任务。我会使用正则表达式: import re new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list] 这应该可以 old_string = "this is going to have a full stop. some written sstuff!" k = ol

因此,我有一长串相同格式的字符串,我想在每个字符串中找到最后一个“.”字符,并用“.”-替换它。我尝试过使用rfind,但似乎无法正确地使用它来完成此任务。

我会使用正则表达式:

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

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:]
天真的方法:

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 . -'

Aditya Sihag的答案只有一个
rfind

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

要从右侧替换:

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

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

一艘班轮将是:

str=str[::-1]。替换(“.”,“-”,1)[::-1]

a = "A long string with a . in the middle ending with ."
#如果要查找任何字符串最后一次出现的索引,在本例中,我们将使用

index = a.rfind("with") 

#结果是44,因为索引从0开始

您可以使用下面的函数来替换从右侧出现的第一个单词

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]

这也会反转替换字符串。除此之外,它重复了root的答案,而且,正如我在这里说的,效率非常低。@Lattyware你是说它反转
a
?我是说它反转
。-'在输出中。仅仅期望用户手动反转字符串文字不是一个好主意-它容易出错和不清楚。@Lattyware同意。我已经把它变成了一个变量(我意识到这是一个低效的方法,并不是在所有情况下都适用-你的
replace\u right
好得多)感谢这么多人。我得研究一下。。。这是在利用切片,对吗?@AdamMagyar是的,容器[a:b]从容器的a到b-1索引进行切片。如果省略“a”,则默认为0;如果省略“b”,则默认为len(容器)。加号运算符只是连接。正如您所指出的,rfind函数返回替换操作应该围绕其进行的索引。如果没有点,这是唯一有效的答案。不过,我会使用一个前瞻:
\(?=[^.]*$)
我当然喜欢这个解决方案,但是拥有
replacements=None
参数对我来说似乎是一个错误,因为如果省略该参数,函数将给出一个错误(在Python 2.7中尝试过)。我建议删除默认值,将其设置为-1(用于无限替换),或者最好将其设置为
replacements=1
(根据OP的需要,这应该是此特定函数的默认行为)。根据定义,此参数是可选的,但如果给定,则必须是int。如果有人需要此参数的一行:
“-”。join(“asd.asd.asd.”.rsplit(“.”,1))
。您所做的只是从右侧执行一次字符串拆分,出现1次,然后使用替换项重新连接字符串。可能重复的操作是错误的。您正在反转字符串,替换它,然后将其反转回来。您正在对反向字符串执行
。替换
。传递给
replace
的两个字符串也必须颠倒。否则,当您再次反转字符串时,刚才插入的字母将向后。只有当你用一个字母替换一个字母时,你才能使用它,即使这样,我也不会把它放在你的代码中,以防将来有人不得不更改它,并开始怀疑为什么一个单词写在sdrawkcab中。