Использование упорядоченных кортежей в качестве шаблонов поиска и замены - PullRequest
1 голос
/ 05 мая 2019

Я хочу использовать словарь в качестве набора шаблонов поиска и замены, который будет применяться к другому словарю с ключами и значениями в виде строк.

У меня есть два словаря. Первый - это упорядоченный словарь (collection.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. Этот дикт должен быть упорядочен, потому что многие из его шаблонов должны применяться в определенном порядке. Стандартный дикт, насколько я знаю, делает это "случайно".

Второй выглядит так:

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) и проверить, найден ли какой-либо из шаблонов поиска (первый элемент каждого кортежа) во втором словаре значений (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 Ответ

1 голос
/ 05 мая 2019

Проблема с вашим кодом в этой строке if find in p:.

Когда вы используете специальный синтаксис RegEx, такой как a0$, оператор if никогда не будет True, вы можете вместо этого использовать regex compile / searchдля этой проверки вместо операции in проверки членства или удалите оператор if все вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...