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