Найти все совпадения и итеративно заменить на индекс - PullRequest
0 голосов
/ 30 августа 2018

У меня следующая проблема:

Я бы хотел отметить найденные совпадения индексом. Пример:

x = "hayde hayde bim bam hayde hayde bim bam hayde hayde bim bbm ba bi bim"

Я хочу заменить все bim с и bam с <1>, <2>, ..

Как это:

x = "hayde hayde <1> <2> hayde hayde <3> <4> hayde hayde <3> bbm ba bi <5>"

И получить вывод имеет дикт:

{"bim": "<1>"}
{"bam": "<2>"}
..

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

1 Ответ

0 голосов
/ 30 августа 2018

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

код

import collections as ct


def replace(s, subs):
    """Return a tuple of substitutes and a related dict."""
    dd = ct.defaultdict(list)
    replaced = []
    for i, word in enumerate(s.split()):
        if word in set(subs):
            pos = "<{}>".format(i)
            replaced.append(pos)
            dd[word].append(pos)
        else:
            replaced.append(word)
    return " ".join(replaced), dict(dd)

Демо +

x = "hayde hayde bim bam bimbam hayde hayde bim bam hayde hayde bim bbm ba bi bim"
replace(x, ["bim", "bam"])

выход

('hayde hayde <2> <3> bimbam hayde hayde <7> <8> hayde hayde <11> bbm ba bi <15>',
{'bim': ['<2>', '<7>', '<11>', '<15>'], 'bam': ['<3>', '<8>']})

Вы прокомментировали:

Мне нужно знать, где я почистил струны.

Почему бы не перечислить разделенную строку с числами, которые отражают фактические проиндексированные позиции? Числовые заменители в этом примере, таким образом, представляют позиции индекса строки разделения. Вы можете легко поменять их местами с помощью увеличивающегося счетчика.

+ Примечание: тестовый вход немного отличается от OP ("bimbam").

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