Удаление скобок вокруг даты с помощью регулярных выражений - PullRequest
1 голос
/ 23 мая 2019

Допустим, у меня есть такая строка:

Это моя (2019) потрясающая строка (которую я хочу изменить)

Дата в ней имеетостаться, но без скобок.Между тем все остальное, что в скобках, должно идти.Поэтому я хотел бы добиться этого:

Это моя удивительная строка 2019 года

Я могу найти дату, используя это:

\b(201\d{1})\b

И я также могу найти что-нибудь в скобках, используя это:

(\(.*\))

Но я хочу удалить все, только если это не дата в скобках, или я хочу сохранить дату только удаляя скобки.Есть ли способ сделать это без использования if else?

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

В Python 3.5+ вы можете использовать

s = re.sub(r'\((\d{4})\)|\([^()]*\)', r'\1', s)

Если есть ( + 4 цифры + ), оставьте только 4 цифры, в противном случае удалите совпадение.

См. Демонстрационный пример regex .

Подробности

  • \((\d{4})\) - (, затем группа захвата 1 соответствует четырем цифрама затем )
  • | - или
  • \([^()]*\) - (, затем 0+ символов, отличных от ( и ), а затем ).

Замена - это просто \1 обратная ссылка на значение группы 1.

ПРИМЕЧАНИЕ : чтобы использовать этот подход в версиях Python до 3.5, вам потребуетсянеобходимо использовать лямбда-выражение в качестве аргумента замены (из-за ошибки ):

s = re.sub(r'\((\d{4})\)|\([^()]*\)', lambda x: x.group(1) if x.group(1) else '', s)
0 голосов
/ 23 мая 2019

Просто сделайте это с двумя вложенными вызовами на re.sub:

re.sub(r' ?\(.*\)', '', re.sub(r'\((\d{4})\)', '\\1', my_string))

Внутреннее регулярное выражение ищет 4-значные числа в скобках и удаляет скобки. Внешний удаляет все, что осталось в скобках (включая необязательный пробел в начале).

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