繁体   English   中英

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

[英]How to parse triple quote strings with regex?

我正在为一种小语言编写一个解析器,该解析器提供与Python相同的“三引号”字符串。 该语言非常简单,可以通过一堆正则表达式触发转换的有限状态机进行有效解析。

一个强大的约束是解析器必须逐行工作,因此解析三引号引起来的多行字符串时,FSM至少需要两个状态(“输入”三引号字符串时需要一个状态, “离开”)。

我认为一种简单的解决方案是为每行定义三个正则表达式组:一个用于开头的"""模式,一个用于字符串字符,一个用于结束"""模式。 因此,通过测试这三个组的空度,很容易触发正确的过渡

不幸的是,我找不到适合所有情况的正则表达式。 这是我的实验结果:

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)

和运行此代码时的结果:

""" --> ('"""', '', None)
abc --> (None, 'abc', None)
"abc" --> ('"', 'abc"', None)
"""abc""" --> ('"""', 'abc"""', None)
abc""" --> (None, 'abc"""', None)
"""a"b"c --> ('"""', 'a"b"c', None)
"""a"b"c""" --> ('"""', 'a"b"c"""', None)

中间组(。*)过于贪婪,“吃”了结束定界符。 另一方面,当使用惰性形式(参见regex2 )时,它并不匹配所有字符串。

""" --> ('"""', '', None)
abc --> (None, '', None)
"abc" --> ('"', '', None)
"""abc""" --> ('"""', '', None)
abc""" --> (None, '', None)
"""a"b"c --> ('"""', '', None)
"""a"b"c""" --> ('"""', '', None)

所以我想我之间需要一些东西。 任何想法都会受到热烈欢迎。

这可能对您有用

^(\"([^\"\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上查看其运行情况

最后,我找到了与我的第一个猜测非常接近的解决方案:只需使用惰性量词(.*?) ^ (行首)和$ (行尾)包围正则表达式:

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

得到预期的结果:

""" --> ('"""', '', None)
abc --> (None, 'abc', None)
"abc" --> ('"', 'abc', '"')
"""abc""" --> ('"""', 'abc', '"""')
abc""" --> (None, 'abc', '"""')
"""a"b"c --> ('"""', 'a"b"c', None)
"""a"b"c""" --> ('"""', 'a"b"c', '"""')

希望它将来能对某人有所帮助...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM