我想替换python字符串末尾的字符。我有这个字符串:
s = "123123"
我想将2
替换为x
。假设有一个名为replace_last
的方法:
r = replace_last(s, '2', 'x')
print r
1231x3
有没有内置或简单的方法来做到这一点?
答案 0 :(得分:31)
这正是rpartition
函数用于:
rpartition(...) S.rpartition(sep) - > (头,sep,尾巴)
Search for the separator sep in S, starting at the end of S, and return the part before it, the separator itself, and the part after it. If the separator is not found, return two empty strings and S.
我写了这个函数,展示了如何在你的用例中使用rpartition
:
def replace_last(source_string, replace_what, replace_with):
head, _sep, tail = source_string.rpartition(replace_what)
return head + replace_with + tail
s = "123123"
r = replace_last(s, '2', 'x')
print r
输出:
1231x3
答案 1 :(得分:24)
re.sub
替换字符串import re
s = "123123"
s = re.sub('23$', 'penguins', s)
print s
打印:
1231penguins
或
import re
s = "123123"
s = re.sub('^12', 'penguins', s)
print s
打印:
penguins3123
答案 2 :(得分:7)
这是少数几个没有左右版本的字符串函数之一,但我们可以使用一些字符串函数来模仿行为。
>>> s = '123123'
>>> t = s.rsplit('2', 1)
>>> u = 'x'.join(t)
>>> u
'1231x3'
或
>>> 'x'.join('123123'.rsplit('2', 1))
'1231x3'
答案 3 :(得分:6)
>>> s = "aaa bbb aaa bbb"
>>> s[::-1].replace('bbb','xxx',1)[::-1]
'aaa bbb aaa xxx'
对于你的第二个例子
>>> s = "123123"
>>> s[::-1].replace('2','x',1)[::-1]
'1231x3'
答案 4 :(得分:2)
这是一个基于对您的问题的简单解释的解决方案。更好的答案需要更多信息。
>>> s = "aaa bbb aaa bbb"
>>> separator = " "
>>> parts = s.split(separator)
>>> separator.join(parts[:-1] + ["xxx"])
'aaa bbb aaa xxx'
<强>更新强>
(看过编辑过的问题后)另一个非常具体的答案。
>>> s = "123123"
>>> separator = "2"
>>> parts = s.split(separator)
>>> separator.join(parts[:-1]) + "x" + parts[-1]
'1231x3'
更新2
有更好的way to do this。礼貌@mizipzor。
答案 5 :(得分:2)
当想要的匹配位于字符串末尾时,re.sub
即可解决。
>>> import re
>>> s = "aaa bbb aaa bbb"
>>> s
'aaa bbb aaa bbb'
>>> re.sub('bbb$', 'xxx', s)
'aaa bbb aaa xxx'
>>>
答案 6 :(得分:0)
我得到了一个棘手的答案,但是效率不够
>>> fname = '12345.png.pngasdfg.png'
>>> suffix = '.png'
>>> fname_rev = fname[::-1]
>>> suffix_rev = suffix[::-1]
>>> fullname_rev = fname_rev.replace(suffix_rev, '', 1)
>>> fullname = fullname_rev[::-1]
>>> fullname '12345.png.pngasdfg'
内置函数replace()带有三个参数
str.replace(old, new, max_time)
因此,您可以从原始字符串中删除最后一个保留的字符串
答案 7 :(得分:0)
对于第二个示例,我建议使用rsplit
,因为它非常易于使用并且可以直接实现目标。这是一个小功能:
def replace_ending(sentence, old, new):
if sentence.endswith(old):
i = sentence.rsplit(old,1)
new_sentence =new.join(i)
return new_sentence
return sentence
print(replace_ending("aaa bbb aaa bbb", "bbb", "xxx"))
输出:
aaa bbb aaa xxx
答案 8 :(得分:0)
有一种方法可以处理函数 replace
以使其反向工作。
这个想法是从头到尾读取字符串、要替换的文本和新文本。逻辑保持不变。
这是基于使用 [::-1]
向后切换字符串的方式。
例如:
>>> a = "123 456 123 456 123 456"
>>> print(a)
123 456 123 456 123 456
我们想用“abc”替换最后一次(或两次或n次)出现的“123”
>>> res = a[::-1].replace("123"[::-1], "abc"[::-1], 1)[::-1]
>>> print(res)
123 456 123 456 abc 456
这可以作为一个行为与替换完全一样的函数。
def replace_right(text, old, new, count=-1):
"""
Return a copy with all occurrences of substring old replaced by new starting from right.
"""
return text[::-1].replace(old[::-1], new[::-1], count)[::-1]
执行:
>>> replace_right(a, "123", "abc", 1)
'123 456 123 456 abc 456'
>>> replace_right(a, "123", "abc", 2)
'123 456 abc 456 abc 456'
答案 9 :(得分:0)
有一个非常简单的方法来做到这一点,按照我的步骤
str = "stay am stay am delete am"
# want to remove the last am
str = str[:str.rfind('am')]
print(str)
首先,我们找到 am 最后一次出现的索引号,然后将第 0 个索引取到该特定索引。