【问题标题】:PyParsing parsing section with/without spacePyParsing 带/不带空格的解析部分
【发布时间】:2019-10-29 08:46:10
【问题描述】:

我想解析以下代码中的变量,在现有行中有或没有空格。如果我没有空间,我无法区分变量和字符串

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】:

    这是导致解析紧接在“{”字符之前的名称时出现问题的表达式:

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-01
      • 2018-04-07
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 2017-03-29
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多