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.