Регулярное выражение Javascript для определения допустимых строк Python, заключенных в тройные кавычки - PullRequest
2 голосов
/ 29 марта 2019

Я пытаюсь написать подсветку синтаксиса в стиле Prettify для Qiskit Terra (которая близко соответствует синтаксису Python). Очевидно, Prettify использует регулярное выражение Javascript. Например, /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"' - это регулярное выражение, соответствующее действительным строкам в Q # . В основном я пытаюсь собрать эквивалентное выражение регулярного выражения для Python.

Теперь я знаю, что Python поддерживает строки в тройных кавычках, т.е. '''<string>''' и """<string>""" являются допустимыми строками (этот формат особенно используется для строк документации ). Чтобы разобраться с этим делом, я написал соответствующую группу захвата как:

(^\'{3}(?:[^\\]|\\[\s\S])*(?:\'{3}$))

Вот ссылка regex101 .

Это работает нормально за исключением некоторых случаев, таких как:

''' 'This "is" my' && "first 'regex' sentence." ''' &&
''' 'This "is" the second.' '''

Ясно, что здесь следует рассматривать ''' 'This "is" my' && "first 'regex' sentence." ''' как одну строку и ''' 'This "is" the second.' ''' как другую. Но нет, регулярное выражение, которое я написал, объединяет все это в одну строку (проверьте ссылку regex101 ). Таким образом, он не завершает строку, даже когда встречает ''' (соответствует ''' в начале).

Как мне изменить регулярное выражение (^\'{3}(?:[^\\]|\\[\s\S])*(?:\'{3}$)), чтобы учесть этот случай? Я знаю об этом: Как сопоставить «что-нибудь до этой последовательности символов» в регулярном выражении? , но это не совсем отвечает на мой вопрос, по крайней мере, не напрямую.

1 Ответ

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

Я не знаю, для чего еще вы хотите использовать это, но следующее регулярное выражение делает то, что вы хотите, с примером, приведенным с флагом MULTILINE.

My_search = re.findall("(?:^\'{3})(.*)(?:\'{3})", My_string, re.MULTILINE)

print(My_search[0])
print(My_search[1])

Выход есть,

'This "is" my' && "first 'regex' sentence." 
'This "is" the second.' 

Вы также можете увидеть, как это работает здесь https://regex101.com/r/k4adk2/11

...