在字符串中查找最后一个子字符串出现的位置,并将其替换

108

我有一个以相同格式排列的字符串列表,我想在每个字符串中找到最后一个“.”字符,并将其替换为“. - ”。我尝试使用rfind来实现这个目标,但我似乎无法正确利用它。


7个回答

168

这样就可以了

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
非常感谢你。我需要花一点时间来学习它...这是利用切片,对吗? - Adam Magyar
@AdamMagyar 是的,container[a:b] 从容器的 a 到 b-1 索引进行切片。如果省略 'a',则默认为 0;如果省略 'b',则默认为 len(container)。加号运算符只是连接操作。正如你指出的那样,rfind 函数返回替换操作应该发生的索引。 - Aditya Sihag

28

从右侧进行替换:

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
如果有人想要一行代码实现这个功能,可以使用以下代码:". -".join("asd.asd.asd.".rsplit(".", 1))。你所做的就是从字符串右侧进行一次分割,并使用替换将字符串重新连接起来。 - bsplosion

15

我会使用正则表达式:

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。 - user3064538

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 吗? - Alex L
我的意思是将 '. -' 反转输出。 - Gareth Latty
仅期望用户手动反转字符串文字并不是一个好主意 - 它容易出错且不清晰。 - Gareth Latty
@Lattyware 同意。我已经将它设置为变量。(我意识到这是一种低效的方法,并且不适用于所有情况 - 你的 replace_right 更好) - Alex L
这不是我的 - 我只是编辑了Varinder Singh答案中的示例 - 我的第一个想法实际上也是这种方法。 - Gareth Latty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接