我想用不同的值(从字典中)替换出现的字符串。
string = 'asfd @@@ fdsfd @@@ ffds @@@ asdf'
kv = {1: 'hi', 2: 'there', 3: 'bla'}
预期:
string = 'asfd hi fdsfd there ffds bla asdf'
我已经尝试了几种解决方案,尤其是使用.replace或re.sub的解决方案,但仍然找不到好的解决方案。
答案 0 :(得分:6)
单行解决方案:
string.replace('@@@', '{}', len(kv)).format(*kv.values())
简短说明:
'@@@'
替换所有'{}'
字符串。 len(kv)
将替换次数减少到字典的长度,避免当字典中的元素少于字符串中IndexError
的数目时'@@@'
kv.values()
提取字典值*kv.values()
解开字典值,并将其作为参数传递给字符串format
方法。示例代码执行:
输入
string = 'asfd @@@ fdsfd @@@ ffds @@@ asdf'
kv = {'1': 'hi', '2': 'there', '3': 'bla'}
并输出
string.replace('@@@', '{}', len(kv)).format(*kv.values())
#Out: 'asfd hi fdsfd there ffds bla asdf'
此解决方案的优势:
没有显式循环(显式循环在python中几乎总是一个坏主意),只有一行代码。此外,当 '@@@'
的数量小于**或大于kv
**中的值数量时,也可以工作在count
中指定了str.replace
参数。
这将导致我的解决方案的 final 和99%的 failsafe 变体,在{中使用dict的len
作为count
参数{1}}:
replace
答案 1 :(得分:3)
这是将str.replace
与可选参数count
一起使用的一种方法。
例如:
s = 'asfd @@@ fdsfd @@@ ffds @@@ asdf'
kv = {'1': 'hi', '2': 'there', '3': 'bla'}
for k, v in sorted(kv.items()):
s = s.replace("@@@", v, 1)
print(s)
答案 2 :(得分:1)
您可以使用re.sub
来完成工作而无需进行任何排序
返回通过替换最左边的非重叠而获得的字符串 替换repl在字符串中出现模式的情况。如果 找不到模式,字符串不变。代表可以是 字符串或函数;如果是字符串,则其中的任何反斜杠都将转义 已处理。
import re
string = 'asfd @@@ fdsfd @@@ ffds @@@ asdf'
kv = {'1': 'hi', '2': 'there', '3': 'bla'}
class repl:
def __init__(self):
self.called=0
def __call__(self,match):
self.called+=1
return kv[str(self.called)]
print(re.sub('@@@',repl(),string))
输出
asfd hi fdsfd there ffds bla asdf
答案 3 :(得分:0)
string = 'asfd @@@ fdsfd @@@ ffds @@@ asdf'
kv = {1: 'hi', 2: 'there', 3: 'bla'}
for k,v in kv.items():
string = string.replace('@@@', v, 1)
print(string)
输出:
asfd hi fdsfd there ffds bla asdf
答案 4 :(得分:0)
kv = {'1': 'hi', '2': 'there', '3': 'bla'}
string = 'asfd @@@ fdsfd @@@ ffds @@@ asdf'
string_list=string.split('@@@')
string_list_out=[]
for i in range(len(string_list)):
if i==0:
string_list_out.append(string_list[0])
else:
string_list_out.append(kv[str(i)])
string_list_out.append(string_list[i])
string_list_out=''.join(string_list_out)
print(string_list_out)
'asfd hi fdsfd there ffds bla asdf'
答案 5 :(得分:0)
import re
string = 'asfd @@@ fdsfd @@@ ffds @@@ asdf'
kv = {1: 'hi', 2: 'there', 3: 'bla'}
counter = 1
def data_():
global counter
str_replace = kv[counter]
counter += 1
return str_replace
print(re.sub(r'@@@', data_(), string))
>>> asfd hi fdsfd there ffds bla asdf