rreplace——如何替换字符串中表达式的最后一次出现?
- 2025-04-15 09:20:00
- admin 原创
- 32
问题描述:
Python 中有没有一种快速替换字符串的方法,不是像 Python 那样从头开始replace
,而是从尾开始?例如:
>>> def rreplace(old, new, occurrence)
>>> ... # Code to replace the last occurrences of old by new
>>> '<div><div>Hello</div></div>'.rreplace('</div>','</bad>',1)
>>> '<div><div>Hello</div></bad>'
解决方案 1:
>>> def rreplace(s, old, new, occurrence):
... li = s.rsplit(old, occurrence)
... return new.join(li)
...
>>> s
'1232425'
>>> rreplace(s, '2', ' ', 2)
'123 4 5'
>>> rreplace(s, '2', ' ', 3)
'1 3 4 5'
>>> rreplace(s, '2', ' ', 4)
'1 3 4 5'
>>> rreplace(s, '2', ' ', 0)
'1232425'
解决方案 2:
以下是一行代码:
result = new.join(s.rsplit(old, maxreplace))
返回字符串s的副本,其中所有出现的子字符串old均被new替换。前maxreplace次将被替换。
以及使用的完整示例:
s = 'mississipi'
old = 'iss'
new = 'XXX'
maxreplace = 1
result = new.join(s.rsplit(old, maxreplace))
>>> result
'missXXXipi'
解决方案 3:
我不会假装这是最有效的方法,但它确实很简单。它反转所有相关的字符串,str.replace
对反转后的字符串执行普通的替换,然后将结果反转回正确的方向:
>>> def rreplace(s, old, new, count):
... return (s[::-1].replace(old[::-1], new[::-1], count))[::-1]
...
>>> rreplace('<div><div>Hello</div></div>', '</div>', '</bad>', 1)
'<div><div>Hello</div></bad>'
解决方案 4:
只需反转字符串,替换第一次出现的内容并再次反转它:
mystr = "Remove last occurrence of a BAD word. This is a last BAD word."
removal = "BAD"
reverse_removal = removal[::-1]
replacement = "GOOD"
reverse_replacement = replacement[::-1]
newstr = mystr[::-1].replace(reverse_removal, reverse_replacement, 1)[::-1]
print ("mystr:", mystr)
print ("newstr:", newstr)
输出:
mystr: Remove last occurence of a BAD word. This is a last BAD word.
newstr: Remove last occurence of a BAD word. This is a last GOOD word.
解决方案 5:
如果您知道“旧”字符串不包含任何特殊字符,则可以使用正则表达式来完成:
In [44]: s = '<div><div>Hello</div></div>'
In [45]: import re
In [46]: re.sub(r'(.*)</div>', r'</bad>', s)
Out[46]: '<div><div>Hello</div></bad>'
解决方案 6:
这是该问题的递归解决方案:
def rreplace(s, old, new, occurence = 1):
if occurence == 0:
return s
left, found, right = s.rpartition(old)
if found == "":
return right
else:
return rreplace(left, old, new, occurence - 1) + new + right
解决方案 7:
尝试一下:
def replace_last(string, old, new):
old_idx = string.rfind(old)
return string[:old_idx] + new + string[old_idx+len(old):]
类似地,您可以通过用string.find()替换string.rfind()来替换第一次出现的情况。
我希望它有帮助。
解决方案 8:
如果您有一个字符串列表,您可以在一个行中使用列表推导和字符串切片来覆盖整个列表。无需使用函数;
myList = [x[::-1].replace('<div>'[::-1],'<bad>'[::-1],1)[::-1] if x.endswith('<div>') else x for x in myList]
我使用if else来保留列表中不符合替换条件的项目,否则您的列表将只是符合条件的项目。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD