python: использование регулярного выражения для отрезания ограничительных скобок/кавычек
У меня есть строка вида:
[ограничительный символ]текст[ограничительный символ]
например
(какой-то текст)
"ещё какой-то текст "
Необходимо создать регулярное выражение, которое:
- отрезает ограничительные символы, причём только парные, т.е. вариант
"текст)трогаться не будет - у оставшегося текста отрезаются пробелы и табуляции по концам
Написал такую регулярку:
\([ \t]*(.*)[ \t]*\)|\"[ \t]*(.*)[ \t]*\"|\'[ \t]*(.*)[ \t]*\'$
на сайте для тестов регулярок (https://regex101.com/) всё работает замечательно, но в питоне код:
re.sub(r"^\([ \t]*(.*)[ \t]*\)|\"[ \t]*(.*)[ \t]*\"|\\'[ \t]*(.*)[ \t]*\\'$", r"\1", text)
не работает
Подскажите в чем ошибка и как ее исправить о парности символов
P.S.
кстати исходное регулярное выражение почему-то не отрезает пробелы в конце строки - как это можно исправить?
можно ли как-то сократить размер регулярки при сохранении условия
Ответы (1 шт):
Так как ответы на основной вопрос были даны в комментарии, то предложу немного другой вариант регулярного выражения:
regex = r"^(?:(\()|([\"']))[ \t]*(.*?)[ \t]*(?(2)\2|\))$"
Преимущество данного выражения в том, что данные всегда будут находиться в третьей \3 группе захвата.
Пример: https://regex101.com
О логике:
(?:(\()|([\"'])) - используем незахватываемую группу, для поиска ограничивающего символа с логическим или - или открывающуюся скобку ( или одна из кавычек одинарная и двойная "'
[ \t]* - ноль и более табуляций и знаков пробела
(.*?) - группа в которую попадут под захват нужные данные (3я группа)
[ \t]* - ноль и более табуляций и знаков пробела
(?(2)\2|\)) - проверка, если вторая группа была захвачено, значит первым символом в строке была захвачена кавычка (одинарная или двойная), если это так, то ищем до аналогичного символа, иначе закрывающаяся скобка )