我正在尝试为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