用于识别包含在三引号内的有效 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 风格正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Python argparse - 从 cmdline 读取引号内的多个字符串

ParisGabriel:Python无止境 day06

Python-注释和字符串

正则表达式匹配双引号内的每个字符串并包含转义引号

python数据类型详解(全面)

python基本概念