повторяет {и {{ - PullRequest
       19

повторяет {и {{

0 голосов
/ 31 марта 2019

По причинам, выходящим за рамки этого, я создаю простой bibtex-парсер. Некоторые поля bibtex ограничены одной фигурной скобкой, а другие - двойными фигурными скобками. Фигурные скобки также являются допустимым содержимым поля.

У меня есть строка, которая, как мне известно, соответствует одному полю в следующих форматах:

fieldName1 = {{ content }},\n    -> content
fieldName2 = { content },\n      -> content
fieldName3 = { {[}content,] },\n -> {[}content,]

С помощью этого шаблона я могу восстановить содержимое:

re.compile(r"(?P<name>[\w-]+?)[\s]*=[\s]*({(?P<content>.*)})",    flags=re.IGNORECASE|re.DOTALL) 

Но он будет содержать {и}, если в этом поле используются двойные скобки.

Есть ли более простой способ удалить их, чем тестировать [0] == '{' and [-1] == '}'

1 Ответ

1 голос
/ 31 марта 2019

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

(?P<name>[\w-]+?)\s*=\s*{(?:{| {\[})?\s*(?P<content>.*?)(?:,])?\s*}{1,2}

В моем тесте оно соответствует всем 3 вашим образцам.

Рабочий пример (содержащий тест регулярного выражения выше) см. https://regex101.com/r/Gy8IWu/1

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

Редактировать

Регулярное выражение, соответствующее всем 3 вариантам, в соответствии с вашимкомментарий:

(?P<name>[\w-]+?)\s*=\s*{{1,2}\s*(?P<content>(?:{\[})?.*?)\s*}{1,2}

См. обновленный пример: https://regex101.com/r/Gy8IWu/2

...