首先,我想说的是,我所问的问题很难以“紧凑”的方式提出,因此下面将要解释一些事情。
我有两个字典,假设它们是regex = {}
和dict = {}
。
其中第一个包含查找和替换模式,分别为keys
和values
。所以看起来像这样:
# 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'
}
答案 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'}