Javascript 风味正则表达式,用于识别包含在三引号中的有效 Python 字符串

Javascript flavor regex for identifying valid Python strings enclosed within triple quotes

我正在尝试写 Prettify-style syntax highlighter for Qiskit Terra (which closely follows the Python syntax). Apparently, Prettify uses Javascript flavor regex. For instance, /^\"(?:[^\"\]|\[\s\S])*(?:\"|$)/, null, '"' is the regex corresponding to valid strings in Q#。基本上,我试图将 Python 的等价正则表达式放在一起。

现在,我知道 Python 支持三引号内的字符串,即 '''<string>'''"""<string>""" 是有效字符串(这种格式特别用于 docstrings)。为了处理这种情况,我将相应的捕获组写为:

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

这里是regex101 link

works okay 除了在某些情况下,例如:

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

很明显,它应该将 ''' 'This "is" my' && "first 'regex' sentence." ''' 视为一个字符串,将 ''' 'This "is" the second.' ''' 视为另一个字符串。但是不,我写的正则表达式将整个东西组合在一起作为一个字符串(检查 regex101 link)。也就是说,即使遇到 ''' (对应开头的 ''' ),它也不会结束字符串。

我应该如何修改正则表达式 (^\'{3}(?:[^\]|\[\s\S])*(?:\'{3}$)) 以考虑到这种情况?我知道这一点:How to match “anything up until this sequence of characters” in a regular expression? 但它并没有完全回答我的问题,至少没有直接回答。

我不知道你还想用它做什么,但下面的正则表达式可以用 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