用于识别包含在三引号内的有效 Python 字符串的 Javascript 风格正则表达式
Posted
技术标签:
【中文标题】用于识别包含在三引号内的有效 Python 字符串的 Javascript 风格正则表达式【英文标题】:Javascript flavor regex for identifying valid Python strings enclosed within triple quotes 【发布时间】:2019-08-20 20:34:50 【问题描述】:我正在尝试为Qiskit Terra 写一个Prettify-style syntax highlighter(它紧跟Python 语法)。显然,Prettify 使用了 javascript 风格的正则表达式。例如,/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"'
是对应于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? 但它并不能完全回答我的问题,至少不能直接回答。
【问题讨论】:
查看 sublime 模块的语法高亮。并通过正则表达式 sn-ps。语法中的github.com/MagicStack/MagicPython 可能会有所帮助。 @Raymond 谢谢,检查。我刚刚注意到this answer,这让我想知道是否可以使用正则表达式。 :// 【参考方案1】:我不知道你还想用它做什么,但是下面的正则表达式可以满足你在上面给出的带有 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
【讨论】:
它解决了 OP 中给出的示例,但它不处理三重引号字符串的一般情况,因为它们可以包含转义引号,例如inr""""\""""
\"
应该被抓住。以上是关于用于识别包含在三引号内的有效 Python 字符串的 Javascript 风格正则表达式的主要内容,如果未能解决你的问题,请参考以下文章