Regex 使用有序dict元组作为find&;替换模式

Regex 使用有序dict元组作为find&;替换模式,regex,python-3.x,Regex,Python 3.x,我想使用一个字典作为一个查找和替换模式集,将其应用到另一个字典中,并将键和值作为字符串 我有两本字典。第一个是有序字典(collections.orderedict),其中元组是上面提到的查找和替换模式 此词典的一个片段如下所示: dict1 = { ('e0', 'i0'), ('o0', 'a0'), ('t sj a0$', 'ts a0'), ('tj sj a0$', 'ts a'), ('([bvgdzklmnprstfh])j a0', '\\1j i0'), ('([^s])j

我想使用一个字典作为一个查找和替换模式集,将其应用到另一个字典中,并将键和值作为字符串

我有两本字典。第一个是有序字典(collections.orderedict),其中元组是上面提到的查找和替换模式

此词典的一个片段如下所示:

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')
}
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'
}
如您所见,其中一些模式只是字符串,其中一些包含正则表达式特殊字符。这个dict必须有序,因为它的许多模式必须以特定的顺序应用。据我所知,标准的口述是“随机的”

第二个看起来像这样:

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')
}
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'
}
我的目标是迭代第一个dict(dict1)并检查是否在第二个dictionary(dict2)值中找到了任何find模式(每个元组的第一个元素)。如果是,我希望用替换模式(每个元组的第二个元素)替换它们

我有这个脚本,它几乎可以完成任务。如果我不使用正则表达式特殊字符,它就可以工作。它对$、[]、[^]、\1和其他许多字符串都不起作用(这很奇怪,因为我在Python3控制台中尝试了一些字符串的模式)


预期的结果是让这些正则表达式模式工作。

如果在p:中找到,则这一行代码的问题是


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

如果顺序很重要,您的第一个字典可以是一个列表,您只需要使用
items()
对其进行迭代即可(当然,Python 3.6+保证了dict的顺序)。另外,使用原始字符串来保留regex特殊字符。正如@Khalid Ali所指出的,原始字符串无论如何都不起作用,因为p:
行中有
if find。所以列表中的元组保持在列表中的顺序?那么我就不必使用OrderedDict了。是的,更不用说在字典上迭代检查值会破坏字典中查找的目的(dict ops应该是O(1),而不是线性的)。我只是提到这些因素来简化代码,而不是解决主要问题。我不太清楚你们的预期产量是多少,但我很高兴它能实现!非常感谢。突然又发生了一个问题。我不知道为什么,但我的固定代码(随着Khalid Ali的改进)停止了工作。我的输出字符串包括一些正则表达式“剩余”,如:
a0\1j\1j i0 v a1 f\1h i0 j i0 sj a0
。我想我会开始一个新问题。编辑:没关系,这是一个多“\”的问题。我做了你写的,它成功了。所以,据我所知,去掉这里的
if
语句会使代码运行一种隐藏的
if
无论如何,基本上,如果
re.sub(find,replace,dict2[g])
中有匹配项,就这样做,如果没有,就什么也不做,对吗?正确,只有在目标字符串中找到正则表达式模式时,才会发生替换。