替换Python中的迭代

时间:2019-02-07 11:24:41

标签: python regex

我想用不同的值(从字典中)替换出现的字符串。

string = 'asfd @@@ fdsfd @@@ ffds @@@ asdf'
kv = {1: 'hi', 2: 'there', 3: 'bla'}

预期:

string = 'asfd hi fdsfd there ffds bla asdf'

我已经尝试了几种解决方案,尤其是使用.replace或re.sub的解决方案,但仍然找不到好的解决方案。

6 个答案:

答案 0 :(得分:6)

单行解决方案:

string.replace('@@@', '{}', len(kv)).format(*kv.values())

简短说明:

  • 用python字符串格式标识符'@@@'替换所有'{}'字符串。 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)

MoreInfo

答案 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