Снять скобки вокруг текста и добавить двоеточие в конце - PullRequest
0 голосов
/ 24 мая 2018

У меня есть длинная строка, и я хотел бы заменить вхождения такого типа:

'eggs (spam): tomatoes'

на вхождения такого типа:

'eggs : spam tomatoes'

То есть, если естьявляется шаблоном вида 'левая скобка, текст, правая скобка, двойная двоеточие, пробел', тогда я хотел бы заменить его на 'двойная двоеточие, пробел, текст'.

Я пробовалнаписав следующее:

import re
re.sub('\(.+\): ', '', 'eggs (spam): tomatoes')

но (что неудивительно) он полностью удаляет текст в квадратных скобках, и я не знаю, как сохранить текст, который был ранее заключен в скобки в части функции replace.

Ответы [ 5 ]

0 голосов
/ 24 мая 2018

Вы можете использовать re.findall и re.sub:

import re
s = 'eggs (spam): tomatoes'
new_s = re.sub('\(\w+\):', '{}', s).format(*[f': {i}' for i in re.findall('\((.*?)\)', s)])

Выход:

'eggs : spam tomatoes'
0 голосов
/ 24 мая 2018

Это работает:

>>> re.sub('\((.*)\): ', ': \\1 ', 'eggs (spam): tomatoes')
eggs : spam tomatoes
0 голосов
/ 24 мая 2018

Использование re.sub('\((.*?)\): ', r':\1 ', 'eggs (spam): tomatoes')

Демонстрация:

import re
print(re.sub('\((.*?)\): ', r':\1 ', 'eggs (spam): tomatoes'))

Выход:

eggs :spam tomatoes
0 голосов
/ 24 мая 2018

В вашем коде вы выбираете от открывающей скобки до закрывающей скобки, включая двоеточие, и заменяете ее пустой строкой.Вот почему он полностью удаляет заключенный в скобки текст.

Вы можете использовать 2 группы захвата и заменить их на группу 2, группу 1:

\((.+?)\)(:)

  • \( Совпадение буквально
  • (.+?) Захват в группе 1 \\1 любой символ один или несколько раз без жадности
  • \) Совпадение буквально
  • (:) Захватить двоеточие в группе 2 \\2

Например:

import re
print(re.sub(r"\((.+?)\)(:)", "\\2 \\1", 'eggs (spam): tomatoes'))

Это даст вам:

eggs : spam tomatoes

Demo

0 голосов
/ 24 мая 2018

Вы должны работать с группами захвата:

re.sub(r"\(([^()]*)\)(:)", r"\2 \1", 'eggs (spam): tomatoes')

Демонстрация в реальном времени

Распределение регулярных выражений:

  • \( Открытие матчакруглые скобки
  • ( начало группы захвата один
    • [^()]* соответствие любой вещи между
  • ) конец группы захвата один
  • \) Соответствует закрывающей скобке
  • (:) Захватить двоеточие (CG # 2)

Строка замены "\2 \1" означает, что замена должна следовать за данными второй группы захвата, затемпробел, затем первая группа данных захвата.

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