使用有序的dict元组作为查找和替换模式

时间:2019-05-04 22:58:32

标签: regex python-3.x

我想将字典用作查找和替换模式,该模式设置为将键和值用作字符串的其他字典。

我有两个字典。第一个是带有元组的有序字典(collections.OrderedDict),这些元组是上述查找和替换模式。

这本词典的片段是这样的:

dict1 = 
{
('e0', 'i0'),
('o0', 'a0'),
('t sj a0$', 'ts a0'),
('tj sj a0$', 'ts a'),
('([bvgdzklmnprstfh])j a0', '\\1j i0'),
('([^s])j a0$', '\\1j i0')
}

如您所见,其中一些模式只是字符串,其中一些包含RegEx特殊字符。该dict必须排序,因为它的许多模式都必须按特定顺序应用。据我所知,标准字典是“随机地”执行的。

第二个看起来像这样:

dict2 =
{
'обнёсшим': 'o0 b nj o1 s sh i0 m',
'колыхалось': 'k o0 l y0 h a1 l o0 sj',
'непроизводительностях': 'nj e0 p r o0 i0 z v o0 dj i1 tj e0 lj n o0 s tj a0 h',
'цукаемою': 'ts u0 k a1 j e0 m o0 j u0',
'соревнующееся': 's o0 rj e0 v n u1 j u0 sch e0 j e0 sj a0',
'сорганизовано': 's o0 r g a0 nj i0 z o1 v a0 n o0'
}

我的目标是遍历第一个字典(dict1)并检查是否在第二个字典(dict2)值中找到任何查找模式(每个元组的第一个元素)。如果是,我希望将它们中的每一个都替换为替换模式(每个元组的第二个元素)。

我有这个脚本,几乎可以完成工作。如果我不使用RegEx特殊字符,它将起作用。它不适用于$,[],[^],\ 1和许多其他语言(这很奇怪,因为我已经在Python3控制台中尝试过一些字符串的模式)。

for find, replace in dict1.items():
    for g, p in dict2.items():
        if find in p:
            dict2[g] = re.sub(find, replace, dict2[g])

预期结果是使这些RegEx模式正常工作。

1 个答案:

答案 0 :(得分:1)

此行if find in p:中的代码存在问题。

当您使用RegEx特殊语法(例如a0$的if语句永远不会成为True时,您可以使用regex编译/搜索进行此检查,而不是使用in成员资格测试操作,或一起删除if语句。