作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 pyparsing api 提取给定输入文本的内容,该文本通常具有以下结构。
Key1 : Value1 \n
Key2 : Value2 \n
. : . \n
. : . \n
. : . \n
Keyn : . \n
在某些情况下,给定键的值可能很长,因此会写入多行。
Key_k : Value_k value_k value_k
value_k value_k value_k
当我有一些带有长值的键时,例如上面的示例,我始终只有第一行中的内容。
这是为我的 pyparsing 定义的 BNF:
keyName = Word(pp.alphanums + '_')
unitDef = Suppress('(') + Word(alphanums + '^*/-._') + Suppress(')')
paramValueDef = SkipTo('*' | lineEnd)
paramDef = keyName('name') + pp.Optional(unitDef)('unit') + pp.Suppress(":" + pp.empty) + paramValueDef('value')
当键和值写在同一行时,我得到了很好的结果。
欢迎任何帮助,并提前感谢您。
最佳答案
随着保罗在船上发表评论,我知道我的答案肯定不是最佳的。但我喜欢尝试可以通过 pyparsing 解决的问题。
做到这一点的一种方法是说“值”是没有空格和后面有冒号的东西,而“键”是。因此,我定义了一个名为 key_ending
的语法元素。
我希望在结果中对键和值进行分组;因此我使用Group
。
>>> import pyparsing as pp
>>> key_name = pp.Word(pp.alphanums+'_')
>>> key_ending = pp.ZeroOrMore(' ') + ':'
>>> key = key_name + key_ending
>>> value = pp.Word(pp.alphanums) + pp.NotAny(key_ending)
>>> values = pp.OneOrMore(value)
>>> param = pp.Group(key + values)
>>> param_stream = pp.OneOrMore(param)
>>> lines = '''\
... key1 : value1
... key2 : value1 value2
... key3: value1
... key4 : value2
... value3 value4
... '''
此行说明解析成功。
>>> param_stream.parseString(lines)
([(['key1', ':', 'value1'], {}), (['key2', ':', 'value1', 'value2'], {}), (['key3', ':', 'value1'], {}), (['key4', ':', 'value2', 'value3', 'value4'], {})], {})
我再次进行解析,这次捕获它,以便我可以显示它的各个位。
>>> r = param_stream.parseString(lines)
>>> for param in r.asList():
... param[0], param[2:]
...
('key1', ['value1'])
('key2', ['value1', 'value2'])
('key3', ['value1'])
('key4', ['value2', 'value3', 'value4'])
完成此操作后,我想到我可以采取使用 pyparsing 的 FollowedBy 的策略,并且有用于查找键值对的内置功能。</p>
关于python - 使用 pyparsing 匹配多行文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46365243/
我是一名优秀的程序员,十分优秀!