Как удалить несколько вхождений шаблона из строки в Python? - PullRequest
3 голосов
/ 12 апреля 2019

Я заинтересован в удалении всех вхождений шаблона в строку Python, где шаблон выглядит как "start-string бла, бла, бла end-string". Это общая проблема, с которой я бы хотел справиться. Это та же проблема, что и Как я могу удалить часть текста из строки всякий раз, когда она начинается с & * (и заканчивается) (*, но в Python, а не Java.

Как бы я решил ту же проблему в Python?

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

'Bla bla bla <mark asd asd asd /> bla bla bla. Yadda yadda yadda <mark alls lkja /> yadda.'

Начало блока для удаления - <mark, а конец - />. Поэтому я делаю следующее:

import re
mystring = "Bla bla bla <mark asd asd asd /> bla bla bla. Yadda yadda yadda <mark akls lkja /> yadda."
tags = "<mark", "/>"
re.sub('%s.*%s' % tags, '', mystring)

Мой желаемый результат -

'Bla bla bla  bla bla bla. Yadda yadda yadda  yadda.'

Но я получаю

'Bla bla bla  yadda.'

Очевидно, что команда использует первый экземпляр начальной строки и последнее вхождение конечной строки.

Как мне сделать так, чтобы он совпадал с шаблоном дважды и выдавал желаемый результат? Это должно быть легко, но, несмотря на поиски по «регулярному выражению Python для удаления нескольких вхождений» и тому подобному, я не нашел ответа. Спасибо.

1 Ответ

3 голосов
/ 12 апреля 2019

В основном вы хотите найти что-нибудь между '<mark' и '/>', поэтому вы начинаете с шаблона

r'<mark .* />'

Однако .* будет жадным, так что вы не будете жадным до васнеобходимо добавить ?, а затем просто использовать re.sub, чтобы заменить эти совпадения пустой строкой

>>> re.sub(r'<mark .*? />', '', s)
'Bla bla bla  bla bla bla. Yadda yadda yadda  yadda.'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...