2

我正在尝试为Qiskit Terra编写一个 Prettify风格的语法荧光笔(它紧跟 Python 语法)。显然,Prettify 使用了 Javascript 风格的正则表达式。例如,是对应于Q#中有效字符串的正则表达式。基本上,我正在尝试为 Python 组合等效的正则表达式。/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"'

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

(^\'{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 链接)。也就是说,即使遇到a '''(对应'''开头的the)也不会结束字符串。

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

4

1 回答 1

0

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

于 2019-03-29T22:55:28.603 回答