4

我需要用增强字符串替换字符串中的字符串。

我的问题是,每次替换 info 中字符串的位置并更改原始字符串:如何以 pythonic 方式更新它?

str = 'If you do not know where you are going, any road will get you there.'

info = {'you': [(3, 3), (25, 3)], 'get you': [(54, 7)], 'know': [(14, 4)]}

# replace 'you' from info with '<b>you</b>' and 'know' with '<i>know</i>'
# results in

str = 'If <b>you</b> do not <i>know</i> where <b>you</b> are going, any road will get you there.'

info = {'<b>you</b>': [(3, 10), (25, 10)], 'get you': [(54, 7)], '<i>know</i>': [(21, 11)]}

到目前为止我的解决方案:

str = 'If you do not know where you are going, any road will get you there.'
info = {'you': [(3, 3), (25, 3)], 'get you': [(54, 7)], 'know': [(14, 4)]}

replacer = [('you', '<b>you</b>'), ('know', '<i>know</i>')]

for s, s2 in replacer:
    print "replacing %s to %s and update position info dict" % (s, s2)

    old_s_pos = info[s]
    diff = len(s2) - len(s)

    new_key_pos = [(old_s_pos[0][0], old_s_pos[0][1] + diff)]

    old_s_pos = old_s_pos[1:]
    if old_s_pos:
        next_old_s_pos_start = old_s_pos[0][0]
    else:
        next_old_s_pos_start = None

    del info[s]

    for key, positions in info.iteritems():

        new_positions = []                    
        for i, (x,y) in enumerate(positions):

            if x < next_old_key_pos_start:
                new_positions.append((x + diff, y))
            else:
                new_positions.append((x, y))

                if next_old_s_pos_start is not None:
                    # update old_s_pos at first pair
                    new_key_pos.append((old_key_pos[0][0], old_s_pos[0][1] + diff))
                    old_s_pos = old_s_pos[1:]
                    if old_s_pos:
                        next_old_s_pos_start = old_s_pos[0][0]

        info[key] = new_positions
    info[s2] = new_key_pos

    print info   

亲切的问候,马蒂亚斯

4

1 回答 1

5

这是基于您应该只替换向后遍历字符串的想法。首先,我必须稍微修改一下您的信息和替换结构:

str = 'If you do not know where you are going, any road will get you there.'
info = {'you': [(3, 3), (25, 3)], 'get you': [(54, 7)], 'know': [(14, 4)]}
replacer = [('you', '<b>you</b>'), ('know', '<i>know</i>')]

info2 = {}
replacer2 = {}

for original, replacement in replacer:
    replacer2[original] = replacement

for k, v in info.items():
    for start, length in v:
        replacement = None
        if k in replacer2:
            replacement = replacer2[k]
        info2[start] = (k, length, replacement)

for position in sorted(info2.iterkeys(), reverse=True):
    original, length, replacement = info2[position]
    if replacement is not None:
        str[:position] + replacement + str[position + length]

print str
于 2012-06-29T13:14:48.040 回答