Регулярное выражение для удаления (whatever_inside) IFF и только IFF, если внутри скобок нет интервала

#python #regex

#python #регулярное выражение

Вопрос:

Я хочу удалить что-то вроде (Q.5) или (5.) или (Question5) . У меня есть шаблон регулярных выражений для этого, но дело в том, что он также удаляет вещи за скобками.

Я использовал ((S ))|((s|n)Ss*.s*) , но он преобразует

 (d)  Q 2.3 5.6 hello. J.E.E (Q.4)  (Q4) (Q4.)
  

Для

 Q 3 6 hello. E.E
  

но результат, который я ожидаю, будет

 Q 2.3 5.6 hello. J.E.E
  

Ответ №1:

Предполагая, что вы (...) сбалансированы и не экранированы, вы можете использовать это регулярное выражение с отрицаемым классом символов для поиска:

 s*([^)s]*)s*
  

и замените пустой строкой.

Код:

 >>> import re
>>> s = '(d)  Q 2.3 5.6 hello. J.E.E (Q.4)  (Q4) (Q4.)'
>>> print (re.sub(r's*([^)s]*)s*', '', s))
Q 2.3 5.6 hello. J.E.E
  

Демонстрация регулярных выражений

Подробности регулярного выражения:

  • s* : Сопоставьте 0 или более пробелов
  • ( : Открытие соответствия (
  • [^)s]* : Отрицаемый класс символов для соответствия 0 или более любому символу, который не ) является и не является пробелом
  • ) : Закрытие соответствия )
  • s* : Сопоставьте 0 или более пробелов