PyPars解析节,带/不带空格

问题描述 投票:1回答:1

我想解析以下代码中的变量,而现有行中是否有空格。如果我没有空格,则无法将变量与字符串区分开

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))

应该有可能解析所有变体中的变量

pyparsing
1个回答
0
投票

这是在解析紧接'{'字符前的名称时引起麻烦的表达式:

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

((我厌倦了为每个解析器演示编写那些小的测试循环...)

© www.soinside.com 2019 - 2024. All rights reserved.