我正在为一种小型语言编写一个解析器,它提供与Python相同的“三重引号”字符串。该语言非常简单,可以由有限状态机高效地解析,其中转换由一组正则表达式触发。在
一个强大的约束是解析器必须逐行工作,因此解析三重引号的多行字符串时,FSM至少需要两个状态(一个在“输入”三引号字符串时,一个在“离开”它时)。在
我认为一个简单的解决方案是为每行定义三个regex组:一个用于开始"""模式,一个用于字符串字符,一个用于结束"""模式。因此,通过测试这3组的空性,很容易触发正确的转换
不幸的是,我找不到一个正确的正则表达式来处理所有的情况。以下是我的实验结果:text = '"""\nabc\n"abc"\n"""abc"""\nabc"""\n"""a"b"c\n"""a"b"c"""'
regex1 = r'\s*("""|")?(.*)("""|")?\s*'
regex2 = r'\s*("""|")?(.*?)("""|")?\s*'
for line in text.split('\n'):
match = re.match(regex1, line)
print(line, '-->', match.groups() if match else False)
以及运行此代码时的结果:
^{pr2}$
中间组(.*)太贪心,吃了最后一个定界符。另一方面,当使用lazy表单时(请参见regex2),它并不匹配所有的字符串。在""" --> ('"""', '', None)
abc --> (None, '', None)
"abc" --> ('"', '', None)
"""abc""" --> ('"""', '', None)
abc""" --> (None, '', None)
"""a"b"c --> ('"""', '', None)
"""a"b"c""" --> ('"""', '', None)
所以我想我需要一个介于两者之间的东西。任何想法都会受到热烈欢迎。。。在