查找字符串中子字符串的最后一次出现,将其替换


Answers:


163

这应该做

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
非常感谢你 不得不研究一分钟...这是利用切片,对不对?
亚当·玛格亚

@AdamMagyar是的,container [a:b]从容器的最大b-1索引处切片。如果省略'a',则默认为0;否则,默认为0。如果省略“ b”,则默认为len(container)。加号运算符只是连接在一起。您所指出的rfind函数返回应该在其周围进行替换操作的索引。
Aditya Sihag 2013年

26

要从右侧替换:

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

正在使用:

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

1
我绝对喜欢这个解决方案,但是拥有replacements=None参数似乎对我来说是一个错误,因为如果省略参数,该函数将产生错误(在Python 2.7中进行了尝试)。我建议您删除默认值,将其设置为-1(无限制替换),或者更好地使其replacements=1(根据OP的需要,该特定功能应为默认行为)。根据文档,此参数是可选的,但如果给定,则必须为int。
remarkov '16

如果有人为此需要单线:". -".join("asd.asd.asd.".rsplit(".", 1))。您要做的就是从右侧进行字符串拆分1次,然后使用替换字符串再次连接该字符串。
bsplosion

14

我会使用正则表达式:

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

2
如果根本没有点,这是唯一可行的答案。我会提前使用:\.(?=[^.]*$)
georg

6

一个班轮是:

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


1
这是错的。您要反转字符串,将其替换然后再反转。您正在.replace处理反向字符串。传递的两个字符串replace也必须颠倒。否则,当您第二次反转字符串时,刚插入的字母将向后。仅当用一个字母替换一个字母时才可以使用它,即使这样我也不会在您的代码中添加它,以防将来有人必须对其进行更改并开始怀疑为什么单词sdrawkcab被写入。
鲍里斯(Boris)

1

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

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

#如果要查找任何字符串的最后一次出现的索引,在我们的示例中,我们#将查找with的最后一次出现的索引

index = a.rfind("with") 

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


-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:]

这也将替换字符串反转。除此之外,这是root答案的重复,而且,正如我在此处所说的那样,效率很低。
Gareth Latty

@Lattyware你的意思是相反a吗?
亚历克斯L

我的意思是它'. -'在输出中反转。
Gareth Latty

仅期望用户手动反转字符串文字不是一个好主意-容易出错和不清楚。
Gareth Latty

@Lattyware同意。我做了一个变种。(我意识到这是一种效率低下的方法,并不适合所有情况-您的replace_right情况要好得多)
Alex L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.