【问题标题】:Pyparsing grammar with Optional() subclass带有 Optional() 子类的 Pyparsing 语法
【发布时间】:2019-12-18 18:43:19
【问题描述】:

我正在解析具有一对标签的路由器输出:值。值可以省略。为了解析它,我使用了具有默认值的 Optional() 子类。为什么解析器会忽略它(以及价值分配中的~White)?

我的代码

from pyparsing import *

if __name__ == '__main__':
    text = '''
    Peer AS              : 65000            Peer Port            : 0    
    Peer Address         : 100.8.0.1
    Local AS             : 65000            Local Port           : 0    
    Remote Capability    : 
    Local AddPath Capabi*: Disabled
    Remote AddPath Capab*: Send - None
    Graceful Restart     : Disabled
    Import Policy        : None Specified / Inherited
    Export Policy        : Access_EXP 
    '''

    label_word = Word(printables, excludeChars=':')
    value_word = Word(printables)
    separator = Optional('*') + ': '

    label = Combine(OneOrMore(label_word | Suppress(White(' ', max=1)) + ~White())) + FollowedBy(separator)
    value = Combine(ZeroOrMore(Word(printables) | White(' ', max=1) + ~White()))
    attr_expr = label + Suppress(separator) + Optional(value, default='')

    result = Dict(OneOrMore(Group(attr_expr))).parseString(text)
    print(result.dump())

结果

- ExportPolicy: 'Access_EXP'
- GracefulRestart: 'Disabled'
- ImportPolicy: 'None Specified / Inherited'
- LocalAS: '65000'
- LocalPort: '0'
- PeerAS: '65000'
- PeerAddress: '100.8.0.1'
- PeerPort: '0'
- RemoteAddPathCapab*: 'Send - None'
- RemoteCapability: 'Local AddPath Capabi*: Disabled'

问题

“RemoteCapability”有一个问题,它有一个空值但被解析为下一个字符串(另一对标签:值)。如何解决?

【问题讨论】:

    标签: pyparsing


    【解决方案1】:

    当解析多个键值对时,值是可选的,通常必须使用负前瞻作为多重解析器的一部分。也就是说,一个值只能是一个值,如果你首先检查它是否不是一个键。

    您的解决方案是在 value 的定义中,首先检查您是否正在解析 label - 如果是,则解析器已前进到下一个标签并且当前标签没有值一。为此,只需在 ZeroOrMore 重复中添加 ~label

    value = Combine(ZeroOrMore(~label + Word(printables) | White(' ', max=1) + ~White()))
    

    有了这个改变,我现在得到了你想要的解析输出:

    - ExportPolicy: 'Access_EXP'
    - GracefulRestart: 'Disabled'
    - ImportPolicy: 'None Specified / Inherited'
    - LocalAS: 65000
    - LocalAddPathCapabi*: 'Disabled'
    - LocalPort: 0
    - PeerAS: 65000
    - PeerAddress: '100.8.0.1'
    - PeerPort: 0
    - RemoteAddPathCapab*: 'Send - None'
    - RemoteCapability: ''
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 2019-05-11
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      相关资源
      最近更新 更多