Який рекомендований спосіб заміни декількох рядків у одному великому рядку в Python?

У мене багато рядків і одна велика рядок (це вміст файлу). Мені потрібно замінити кожну і кожну появу першого члена в кожній парі з відповідним другим.

Наприклад, маючи пари ("AA", "BB") і ("qq", "rt") мені потрібно замінити кожну появу AA з BB та qq з rt .

Струнги в парах є унікальними, тому порядок заміни не має значення для кінцевого результату.

Мій код python найбільш наївний - я застосую метод string.replace послідовно, поки всі пари не вичерпаються:

>>> s="frsfsdAAsdfvsdfvqqdsff"
>>> pairs=[('AA', 'BB'), ('qq', 'rt')]
>>> for p in pairs:
...   s=s.replace(p[0], p[1])
...
>>> s
'frsfsdBBsdfvsdfvrtdsff'
>>>

Я вважаю це поганим рішенням для великих рядків. Чи може хтось запропонувати більш ефективний?

Питання про те, як це зробити в Python.

Дякую.

4

1 Відповіді

Існує ще щось неправильне з вашим запропонованим рішенням: після того, як буде зроблено першу заміну, результуючий рядок може збігатися, і ті самі символи можна буде знову замінити. Наприклад, ваше рішення не дало бажаного результату, якщо ви намагалися поміняти 'qq' і 'ff' , встановивши pairs = [('qq', ' ff '), (' ff ',' qq ')] .

Ви можете спробувати це замість цього:

>>> d = dict(pairs)
>>> import re
>>> pattern = re.compile('|'.join(re.escape(k) for k in d))
>>> pattern.sub(lambda k:d[k.group()], s))
frsfsdBBsdfvsdfvrtdsff
3
додано
О, але я чітко зазначив у питанні, і я цитую: Струни в парі є унікальними, тому порядок заміни не має значення для кінцевого результату. Навіть якщо частина замовлення не має значення , попередня умова все ще тримає - всі рядки унікальні.
додано Автор mark, джерело
Чому так? string.replace замінює всі випадки - 'mmmAAmmmmAAmmmAA'.replace (' AA ',' BB ') ==' mmmBBmmmmBBmmmBB ' - True
додано Автор mark, джерело
Я думаю, що я отримаю його зараз, комбінація рядок заміни з іншими символами може привести до нових матчів, які потім будуть замінені. Хороший лов, дякую.
додано Автор mark, джерело
@mark: це не має ніякої різниці взагалі. Ваше рішення як і раніше не працює . Я міг би легко знайти інший приклад, де всі рядки унікальні, але ваше рішення все одно буде невдачею , щоб отримати очікуваний результат.
додано Автор Mark Byers, джерело
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;