如何用正则表达式解析三引号字符串?

2024-05-15 20:02:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一种小型语言编写一个解析器,它提供与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)

所以我想我需要一个介于两者之间的东西。任何想法都会受到热烈欢迎。。。在


Tags: 字符串textnone语言解析器matchline模式
2条回答

最后,我找到了一个与我的第一个猜测非常接近的解决方案:只需使用lazy量词(.*?),并使用^(行首)和{}(行尾)包围regex:

regex3 = r'^\s*("""|")?(.*?)("""|")?\s*$'

要获得预期结果:

^{pr2}$

希望它能帮助将来的人。。。在

这可能对你有用

^(\"([^\"\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"|'([^'\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*'|\"\"\"((?!\"\"\")[^\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"\"\")$

这是我从一个项目上剪下来的东西。请在regex101.com查看它的实际操作。在

相关问题 更多 >