#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>
один или несколько раз из-за
.