代码之家  ›  专栏  ›  技术社区  ›  lampShadesDrifter

按索引“同时”插入多个python子字符串

  •  2
  • lampShadesDrifter  · 技术社区  · 7 年前

    假设我有一根绳子

    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包含有关要插入的单词的信息,字段的含义为:

    • being:要插入的单词的起始索引 之后 (含)

    • 结束:要插入的单词的结束索引 之后 (独家)

    • 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:]) 
    

    但这样做时,每次迭代都会更改字符串的总长度,因此开始和结束索引不再适用于dict中要插入字符串的下一个单词。另一种方法是根据之前插入的子字符串的长度以及要插入的当前字符串是在之前插入的子字符串的位置之前还是之后插入(看起来有点难看),计算插入的新偏移量。

    还有别的方法吗?谢谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   Michael    5 年前

    您可以从末尾向前插入,这样就不必考虑索引的增加

        2
  •  0
  •   Ajax1234    7 年前

    您可以使用 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