Poprawne analizowanie literałów ciągów za pomocą modułu re pytona

Próbuję dodać obsługę lekkiego przecenienia dla preprocesora javascript, który piszę w Pythonie.

W większości działa, ale czasami regex, którego używam, działa trochę dziwnie i myślę, że ma to coś wspólnego z ciągami znaków i sekwencjami ucieczki.

Wyrażenie regularne to:(?<!\\)\"[^\"]+\"

Tak, wiem, że pasuje tylko do ciągów rozpoczynających się od a" postać. Jednak ten projekt zrodził się z ciekawości bardziej niż czegokolwiek, więc na razie mogę z tym żyć.

Aby to rozbić:

(?<\\)\"    # The group should begin with a quotation mark that is not escaped
[^\"]+      # and match any number of at least one character that is not a quotation mark (this is the biggest problem, I know)
\"          # and end at the first quotation mark it finds

Mając to na uwadze, ja (oczywiście) zaczynam bić problemy z takimi rzeczami:

"This is a string with an \"escaped quote\" inside it"

Nie jestem pewien, jak powiedzieć „Wszystko oprócz znaku cudzysłowu, chyba że ten znak ucieknie”. Próbowałem:

([^\"]|\\\")+     # a group of anything but a quote or an escaped quote

, ale to prowadzi do bardzo dziwnych wyników.

Jestem w pełni przygotowany, aby usłyszeć, że wszystko idzie źle. Dla uproszczenia powiedzmy, że ten regex zawsze zaczyna się i kończy podwójnymi cudzysłowami ("), aby uniknąć dodawania kolejnego elementu w miksie. Naprawdę chcę zrozumieć, co mam do tej pory.

Dziękuję za wszelką pomoc.

EDYTOWAĆ

Jako test dla wyrażenia regularnego próbuję znaleźć wszystkie literały łańcuchowe w skrypcie skróconego jQuery za pomocą następującego kodu (używając wzorca unutbu poniżej):

STRLIT = r'''(?x)   # verbose mode
    (?<!\\)    # not preceded by a backslash
    "          # a literal double-quote
    .*?        # non-greedy 1-or-more characters
    (?<!\\)    # not preceded by a backslash
    "          # a literal double-quote
    ''' 
f = open("jquery.min.js","r")
jq = f.read()
f.close()
literals = re.findall(STRLIT,jq)

Poniższa odpowiedź rozwiązuje prawie wszystkie problemy. Te, które powstają, znajdują się w wyrażeniach regularnych jquery, co jest bardzo skrajnym przypadkiem. Rozwiązanie nie błędnie identyfikuje poprawne javascript jako linki do przecen, co było naprawdę celem.

questionAnswers(3)

yourAnswerToTheQuestion