заменить подстроки на основе диапазона индекса значениями словаря из строки - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть следующая строка / предложение (не грамматически правильное)

s = "The user should be able to audit log to view the audit log entries."

И у меня есть словарь с похожими ключами:

d = {'audit' : 'class1',
    'audit log' : 'class2',
    'audit log entries' : 'class3'}

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

   final_ranges = [(49, 66), (27, 36)] #list length may vary

Я хочу перебрать диапазоны индексов и заменить подстроки.

Я попробовал следующий код:

for i in final_ranges:
    for k,v in d.items():
        if s[i[0]:i[1]] == k:
            print(s[0:i[0]] + v + s[i[1]:])

, который будет выводить:

The user should be able to audit log to view the class3.
The user should be able to class2 to view the audit log entries.

Но я хочу, чтобы замены подстрок происходили в одном предложении.

The user should be able to class2 to view the class3.

Я прошел по этой ссылке .Но он не основан на индексных диапазонах.

1 Ответ

0 голосов
/ 25 сентября 2018

Вы на самом деле не обновляете s никогда.Итак, ваши изменения не накапливаются.Попробуйте это:

for i in final_ranges:
    key = s[i[0]:i[1]]
    if (key in d):
        s = s[:i[0]] + d[key] + s[i[1]:]
        print(s)

Хотя, как было указано в комментариях, вам, вероятно, следует использовать замену:

for k, v in d.items():
    s = s.replace(k, v)
    print(s)

Вы можете даже сделать это как понимание списка, если выготов отбросить оператор print:

from functools import reduce
s = reduce(lambda string, kv: string.replace(kv[0], kv[1]), d.items(), s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...