Javascript 风格正则表达式,用于识别括在三引号内的有效 Python 字符串



我正在尝试为Qiskit Terra编写一个Prettify风格的语法突出显示器(它紧随Python语法)。显然,Prettify使用Javascript风格的正则表达式。例如,/^"(?:[^"\]|\[sS])*(?:"|$)/, null, '"'是对应于 Q# 中有效字符串的正则表达式。基本上,我正在尝试将Python的等效正则表达式放在一起。

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

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

这是正则表达式101链接。

这工作正常,除了在某些情况下,例如:

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

显然,在这里它应该将''' 'This "is" my' && "first 'regex' sentence." '''视为一个字符串,''' 'This "is" the second.' '''视为另一个字符串。但是不,我编写的正则表达式将整个事情组合成一个字符串(检查 regex101 链接)。也就是说,即使遇到'''(对应于开头的'''),它也不会结束字符串。

我应该如何修改正则表达式(^'{3}(?:[^\]|\[sS])*(?:'{3}$))以考虑到这种情况?我知道这一点:如何在正则表达式中匹配"直到这个字符序列的任何内容"?但它并没有完全回答我的问题,至少不能直接回答。

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

最新更新