如何在一个基于另一个的字典中查找和替换值

时间:2019-04-14 10:54:37

标签: regex python-3.x

首先,我想说的是,我所问的问题很难以“紧凑”的方式提出,因此下面将要解释一些事情。

我有两个字典,假设它们是regex = {}dict = {}

其中第一个包含查找和替换模式,分别为keysvalues。所以看起来像这样:

# about 50 key/value pairs
regex = {
    'find1' : 'replace1',
    'find2' : 'replace2',
    ...
    'findX' : 'replaceX'
}

第二个看起来像这样:

# about 500,000 key/value pairs
dict = {
    'key1' : 'value1',
    'key2' : 'value2',
    ...
    'keyX' : 'valueX'
}

对于每个keyX,我要检查valueX中的dict,如果valueX是否包含findX中的regex,如果是,我想将其替换为replaceX,然后保存到相同的(dict)或新的字典或列表中(在下面的代码中使用了新列表)。

我尝试使用以下代码:

for keyX, valueX in dict.items():
    for patterns in regex.items():
        if re.search(patterns[0], valueX)
            new_value = re.sub(patterns[0], patterns[1], valueX)

    new_line = keyX + '\t' + new_value

    new_list.append(new_line)

我的机制工作不正确:对于每个valueX,它应该检查它是否包含每个findX中的任何一个,将其替换为replaceX,保存,但是相反,我陷入了混乱输出列表。为不同的new_value复制了keyX。我知道迭代字典(可能是正则表达式字典)有问题,但是我不知道如何解决此问题。


编辑(示例):

regex = {
   's t n': 's n',
   'e0': 'i0',
   'j a0': 'j i0'
}

dict = {
    'известный': 'i0 z vj e1 s t n y0 j',
    'сестра': 'sj e0 s t r a1'
    'январь': 'j a0 n v a1 rj'
}

2 个答案:

答案 0 :(得分:1)

尝试:

regex = {
   's t n': 's n',
   'e0': 'i0',
   'j a0': 'j i0'
}

dict = {
    'известный': 'i0 z vj e1 s t n y0 j',
    'сестра': 'sj e0 s t r a1',
    'январь': 'j a0 n v a1 rj'
}
for k1,v1 in regex.items():
    for k2,v2 in dict.items():
        if k1 in v2:
            dict[k2]=dict[k2].replace(k1,v1)

您会得到:

dict

{'известный': 'i0 z vj e1 s n y0 j',
 'сестра': 'sj i0 s t r a1',
 'январь': 'j i0 n v a1 rj'}

答案 1 :(得分:1)

您可以过滤键并为它们组织一个元组列表,随后循环并相应地替换您的值,如下所示:

# init vars
regex = {'s t n': 's n', 'e0': 'i0', 'j a0': 'j i0'}
d = {'известный': 'i0 z vj e1 s t n y0 j', 'сестра': 'sj e0 s t r a1', 'январь': 'j a0 n v a1 rj'}
# debug prints
print(regex)
print(d)
# get keys for replacements
import itertools
tuples = list(itertools.chain.from_iterable([[(keyx, findx) for keyx in d.keys() if findx in d[keyx]] for findx in regex.keys()]))
# loop and replace
for keyx, findx in tuples:
    d[keyx] = d[keyx].replace(findx, regex[findx])
# print output
print(d)

输出:

{'s t n': 's n', 'e0': 'i0', 'j a0': 'j i0'}
{'известный': 'i0 z vj e1 s t n y0 j', 'сестра': 'sj e0 s t r a1', 'январь': 'j a0 n v a1 rj'}
{'известный': 'i0 z vj e1 s n y0 j', 'сестра': 'sj i0 s t r a1', 'январь': 'j i0 n v a1 rj'}