这是导致解析紧接在“{”字符之前的名称时出现问题的表达式:
Jinja_str_all = NotAny(Regex(r"{{"))+Word(printables)
Pyparsing 与正则表达式不同,no 隐式回溯。 Word 类特别贪心,所以 Word(printables) 将消耗直到行尾的每个非空格字符,因此包括以下 '{' 字符。
如果我理解您的格式,您不想在这些名称中包含“{}”字符,而是将它们用于分组和分隔符,因此您应该将它们从 Word 应匹配的字符列表中排除。
这很容易将excludeChars 参数添加到Word:
Jinja_str_all = NotAny(Regex(r"{{"))+Word(printables, excludeChars='{}')
line_variable 也比它需要的复杂一些。您只需匹配一个或多个 Jinja_str_all 或分组表达式:
line_Variable = OneOrMore(Jinja_str_all
| Group(Jinja_Var_start
+ OneOrMore(Jinja_str)
+ Jinja_Var_end)
)
使用新的省略号,您也可以这样写:
line_Variable = (Jinja_str_all
| Group(Jinja_Var_start
+ Jinja_str[1, ...]
+ Jinja_Var_end)
)[1, ...]
我选择使用runTests 来测试您的输入字符串:
line_Variable[...].runTests(test1)
这会在 test1 变量的每一行上运行表达式,并转储解析结果,或者显示解析误入歧途的地方:
{{ variable }}
[['{{', 'variable', '}}']]
[0]:
['{{', 'variable', '}}']
{{variable}}
[['{{', 'variable', '}}']]
[0]:
['{{', 'variable', '}}']
aldkjflsdf {{ variable }}
['aldkjflsdf', ['{{', 'variable', '}}']]
[0]:
aldkjflsdf
[1]:
['{{', 'variable', '}}']
aldkjflsdf{{ variable }}
['aldkjflsdf', ['{{', 'variable', '}}']]
[0]:
aldkjflsdf
[1]:
['{{', 'variable', '}}']
aldkjflsdf {{ variable }} asdflskdfjlj {{ bbb }}
['aldkjflsdf', ['{{', 'variable', '}}'], 'asdflskdfjlj', ['{{', 'bbb', '}}']]
[0]:
aldkjflsdf
[1]:
['{{', 'variable', '}}']
[2]:
asdflskdfjlj
[3]:
['{{', 'bbb', '}}']
aldkjflsdf{{ variable }}asdflskdfjlj{{ bbb }}sdfsdfwerwr
['aldkjflsdf', ['{{', 'variable', '}}'], 'asdflskdfjlj', ['{{', 'bbb', '}}'], 'sdfsdfwerwr']
[0]:
aldkjflsdf
[1]:
['{{', 'variable', '}}']
[2]:
asdflskdfjlj
[3]:
['{{', 'bbb', '}}']
[4]:
sdfsdfwerwr
(我只是厌倦了为每个解析器演示编写那些小测试循环......)