Заменить последовательную подстроку в строке

#python-3.x #regex #string

#python-3.x #регулярное выражение #строка

Вопрос:

У меня есть строка, в которой шаблон может повторяться последовательно. Моя цель — заменить одно или несколько последовательных вхождений указанного шаблона только одним.

Например. если строка — «BREAKBREAKBREAKword1BREAKword2 word3 BREAKBREAKBREAKBREAKBREAK word4BREAK word5», а шаблон — «BREAK». Конечный результат должен быть «breakword1 breakword2 word3 BREAK word4 Break word5»

Может кто-нибудь, пожалуйста, помочь мне достичь этого в python. Я могу добиться этого, когда шаблон является символом, но не тогда, когда он является строкой. Кроме того, я не хочу реализовывать это с помощью циклов for . Я искал решение для регулярных выражений.

У меня есть регулярное выражение

 re.sub("BREAK{2,}", "BREAK", string). 
  

Это работает, когда BREAK — это всего лишь один символ, но не в строке.

Комментарии:

1. Пожалуйста, укажите регулярное выражение, которое вы придумали, тогда мы поможем вам его исправить

2. Спасибо @DanielFarrell. Я пытался сделать что-то вроде этого re.sub(«BREAK{2,}», «BREAK», строка).

3. просто используйте re.sub("(BREAK){2,}", "BREAK", string) . используйте круглые скобки

4. result = re.sub("(?:BREAK) ", "BREAK", subject)

Ответ №1:

Кванторы регулярных выражений, такие как {2, }, определяют выражение, за которым они непосредственно следуют. BREAK{2,} соответствует литералу BREA , за которым следует 2 или более Ks.

 >>> print(re.match('BREAK{2,}', 'BREAK'))
None
>>> print(re.match('BREAK{2,}', 'BREAKKK'))
<_sre.SRE_Match object at 0x1076a2d98>
  

Чего вам здесь не хватает, так это группировки круглых скобок. Заключение части регулярного выражения в круглые скобки объединяет эту часть регулярного выражения вместе для последующих кванторов, таких как * , , ? , или {2,} .

Круглые скобки также преобразуют текст в нумерованные переменные, которые вы можете включить в замену. Вы также можете назвать группы захвата или даже пометить их как группу без захвата. Но здесь это не имеет большого значения — просто потому, что вы получаете группу захвата, это не значит, что вы должны ее использовать.

 >>> print(re.sub("(BREAK){2,}", "BREAK", "BREAKBREAKBREAKBREAK"))
BREAK
  

Комментарии:

1. Спасибо! Это может быть глупый вопрос, но как вы преобразовали фон в серый? Не могли бы вы мне сказать.

Ответ №2:

Это заменяет несколько вхождений ‘BREAK’:

 subject = 'BREAKBREAKBREAKword1BREAKword2 word3 BREAKBREAKBREAKBREAKBREAK word4BREAK word5'
result = re.sub('(?:BREAK) ', 'BREAK', subject)
  

Это работает, потому (?:<expression>) что это группа без захвата, которая совпадает <expression> один или несколько раз из-за .