регулярное выражение для извлечения ключей bibtex из команд \cite

Я пытаюсь создать регулярное выражение, которое извлекает ключи bibtex из команд cite в текстовом документе. Он должен иметь возможность принимать полный латексный документ в качестве входной строки и возвращать все ключи bibtex как совпадения:

Blahbla document
\somecommand{test} blabla nonsense lorem ipsum \cite{key1} and \cite{key2, key3, key4}

возвращается

key1
key2
key3
key4

Я придумал это, используя https://regex101.com:

\\cite\{([^\},]+)(?:,\s*([^\},]+))*\}

Это работает, за исключением того факта, что только key2 и key4 идентифицируются как совпадения во второй команде \cite.

Может ли кто-нибудь объяснить, что здесь не так и как это должно быть сделано? Заранее спасибо!


person jkokorian    schedule 23.03.2015    source источник
comment
потому что * жадный, который максимально соответствует всем символам.   -  person Avinash Raj    schedule 23.03.2015


Ответы (1)


Чтобы выполнить непрерывное сопоставление строк, вам нужно использовать якорь \G.

(?:\\cite\{|(?<!^)\G),?\s*([^,}]+)

OR

(?:\\cite\{|(?<!^)\G),?\s*([^,}]+)(?=[^}]*})

ДЕМО

person Avinash Raj    schedule 23.03.2015
comment
Извините, я должен был упомянуть, что использую python. В этом случае оба решения терпят неудачу... Что заставляет python вести себя по-другому? - person jkokorian; 23.03.2015
comment
@jkokorian всегда включает тег языка, который вы используете в самом начале. модуль re не поддерживает якорь \G. Вам нужно использовать модуль regex. - person Avinash Raj; 24.03.2015