pyparsing - 带/不带空格的 PyParsing 解析部分
问题描述
我想解析以下代码中的变量,在现有行中有或没有空格。如果我没有空间,我无法区分变量和字符串
from pyparsing import *
Jinja_str_all = NotAny(Regex(r"{{"))+Word(printables)
Jinja_str_all1 = Word(printables)
Jinja_str = Word(alphas)
Jinja_Var_start = Regex(r"{{")
Jinja_Var_end = Regex(r"}}")
test1 = """
{{ variable }}
{{variable}}
aldkjflsdf {{ variable }}
aldkjflsdf{{ variable }}
aldkjflsdf {{ variable }} asdflskdfjlj {{ bbb }}
aldkjflsdf{{ variable }}asdflskdfjlj{{ bbb }}sdfsdfwerwr"""
test2 = "aldkjflsdf {{ variable }}"
line_Variable = ZeroOrMore(Jinja_str_all) + Group(Jinja_Var_start+OneOrMore(Jinja_str) + Jinja_Var_end) + ZeroOrMore(Jinja_str_all)
for a in test1.split("\n"):
print(a)
print(line_Variable.parseString(a))
应该可以解析出所有变体中的变量
解决方案
这是导致解析紧接在“{”字符之前的名称时运行的表达式:
Jinja_str_all = NotAny(Regex(r"{{"))+Word(printables)
与正则表达式不同,Pyparsing没有隐式回溯。该类Word
特别贪婪,因此Word(printables)
将消耗直到行尾的每个非空格字符,因此包括以下'{'字符。
如果我理解您的格式,您不想在这些名称中包含“{}”字符,而是将它们用于分组和分隔符,因此您应该将它们从 Word 应匹配的字符列表中排除。
这很容易将excludeChars
参数添加到Word
:
Jinja_str_all = NotAny(Regex(r"{{"))+Word(printables, excludeChars='{}')
line_variable
也比它需要的复杂一点。您只需要匹配一个或多个Jinja_str_all
OR 分组表达式:
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
(我只是厌倦了为每个解析器演示编写那些小测试循环......)
推荐阅读
- c++ - 如何在不丢失精度的情况下正确表示浮点数中的大数值
- xamarin.forms - 如何在设备的不同像素中自动调整标签大小?
- c - 有没有关于如何在 C 中使用 GStreamer GstBaseTransform 的完整示例?
- karate - 如何根据先前响应的条件执行步骤
- oracle - SYSTEM 表空间增长超过 64GB
- docker - 如何让我的 docker 容器调用我的 API,即我的 docker 主机?
- c# - 在 C# 中不使用 CsvHelper 将 XML 解析为 CSV
- mongodb - 如何检索具有匹配属性的对象数组的 mongo 文档
- prometheus - 通过 grafana 变量将正则表达式传递给 prometheus 查询
- javascript - Selenium Javascript - 如何找到祖父母和父母