按索引'同时'插入多个python子串

时间:2018-04-02 01:41:37

标签: python

假设我有一个字符串

a = 'The dog in the street.' (so len(a)=8).
     01234567  (just adding indices for extra illustration)

现在我想改变那个字符串,在任意位置包含一些任意的单词,比如说,来自(任意大小的)dict:

d = {
        'w1': {'begin':'0', 'end':'3', 'w':'BIG'}
        'w2': {'being':'4', 'end':'7', 'w':'BARKED
    }

其中wx包含有关要插入的单词的信息,字段含义为:

  • 成为:我们要在(包括)之后插入的单词的起始索引

  • 结束:我们要在之后插入的单词的结束索引

  • w:要插入的词

所以'将'dict d'应用于字符串a,我们会得到:

a = 'TheBIGdogBARKEDin the street.'
     0123456789...

请注意,虽然我已经在这里订购了字典值,因此要插入的单词是从左到右的顺序,但情况并非总是如此。

我最初试图用以下方式做到这一点:

for word in d:
    insertion_loc = word['end']
    a = "{}{}{}".format(a[:insertion_loc], word['w'], a[insertion_loc:]) 

但是在执行此操作时,每次迭代都会更改字符串的总长度,因此begin和end索引不再适用于要插入字符串的dict中的下一个单词。立即想到的唯一另一种方法是根据先前插入的子串(s)长度计算插入的新偏移量,以及是否要在先前插入的子串位置之前或之后插入要插入的当前字符串(看起来它看起来有点难看)。

还有其他办法吗?感谢。

2 个答案:

答案 0 :(得分:1)

您可以从末端插入到前端,这样就不必考虑索引增加的问题

答案 1 :(得分:0)

您可以使用re查找d[word]['end']处出现的字符,并使用str.format将这些字符替换为所需的'w'值:

import re
s = "The dog.\n01234567"
d = {
    'w1': {'begin':'0', 'end':'3', 'w':'BIG'},
    'w2': {'being':'7', 'end':'7', 'w':'BARKED'}
}
final_s = re.sub('|'.join('\{}'.format(s[int(b['end'])]) for _, b in d.items()), "{}", s).format(*[c['w'] for _, c in sorted(d.items(), key=lambda x:int(x[0][-1]))])

输出:

TheBIGdogBARKED
01234567