【问题标题】:matching multiline text with pyparsing用pyparsing匹配多行文本
【发布时间】:2017-09-22 12:50:20
【问题描述】:

我正在使用 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')

key和value写在同一行的时候效果不错。

欢迎任何帮助,并提前感谢您。

【问题讨论】:

  • 想象一下所有这些键和值都写在一行上,没有换行符。您如何区分键和值?
  • 另外,对于人们放置或不放置空间的位置,尤其是在那些非常重要的':'s 周围,您希望有多容忍/不容忍?
  • 感谢您的聪明回答。分隔符是包含“:”符号的新行。关于你的第二个问题,你的意思是只有空格还是回到小说行。

标签: python text-mining pyparsing


【解决方案1】:

Paul 在船上提供 cmets,我知道我的答案肯定不是最理想的。但我喜欢尝试可以通过 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,并且有用于查找键值对的内置函数。

【讨论】:

  • 如果您从key_ending 中删除pp.ZeroOrMore(' '),应该也能正常工作。
  • @PaulMcG:谢谢。
  • 非常感谢比尔·贝尔。我已经尝试过您的代码,但结果一无所获!我什至尝试过另一个文本示例,但结果总是空的。
  • 不客气。你能给我们举一个你试过的例子吗?例如,您可以将其发布在 pastebin.com 上。
【解决方案2】:

当我尝试使用以下示例时,我得到了任何结果:

From: Blabla bhlkf <Blabla.bhlkf@atghg.tele2.com>
Sent: 2014-01-22 14:21:31
To: "support@atghg.com" <support@atghg.com>
Subject: Blablablabla bla bla Subject
Case request:                           STL Cas Hours (JKLM, KJH 1 24x7 EPLi
Loc)
Request Type:                           Support (HTL)
Product:                                TGHLKI HS+ / BLOS V. 9.9.x.x
Product Instance State:                 In Service
DSLAM address:                  HGJLKM
Problem Description:                    All usershoud be in nkowns
                               that the first line should be also extracted
Ticket Priority:                                3 = Very import request
Contact Name:                           Blabla
Contact phone:                          +0187 87652 99883 
Alternate phone:                        +012 7890 877343 1 9009 35
Tele2UTA Ticket ID:                     HGFDL5666
Service Agreement:                      7543864
Contact Company:                        FAX2
xlfswott01> users -l | grep 001.14.06
616804042  001.14.060/0001 001:14:060/ 2044K/ 252K ATM 0.0.0.0      
1:14:60-0.100-T-066048   0:07:31    0:00:00
616804043  001.14.060/0001 001:14:060/ 2044K/ 252K ATM 0.0.0.0      
1:14:60-8.35-T-066048    0:07:32    0:00:00
616804044  001.14.060/0001 001:14:060/ 2044K/ 252K ATM 0.0.0.0      
1:14:60-8.40-T-066048    0:07:32    0:00:00
616804054  001.14.064/0001 001:14:064/ 2044K/ 252K ATM 0.0.0.0      
1:14:64-0.100-T-066050   0:07:20    0:00:00
616804055  001.14.064/0001 001:14:064/ 2044K/ 252K ATM 0.0.0.0      
1:14:64-8.35-T-066050    0:07:20    0:00:00
616804056  001.14.064/0001 001:14:064/ 2044K/ 252K ATM 0.0.0.0      
1:14:64-8.40-T-066050    0:07:21    0:00:00
616804057  001.14.065/0001 001:14:065/ 2044K/ 252K ATM 0.0.0.0      
1:14:65-0.100-T-067398   0:07:22    0:00:00
616804058  001.14.065/0001 001:14:065/ 2044K/ 252K ATM 0.0.0.0      
1:14:65-8.35-T-067398    0:07:25    0:00:00
616804059  001.14.065/0001 001:14:065/ 2044K/ 252K ATM 0.0.0.0      
1:14:65-8.40-T-067398    0:07:26    0:00:00
<end user list>  3053 active user(s)
<grep> Found 9 line(s) matching search criteria
xlfswott01> users -l | grep 001.14.05
616804031  001.14.054/0001 001:14:054/ 6997K/ 903K ATM 0.0.0.0      
1:14:54-0.100-T-004048   0:08:14    0:00:00
616804032  001.14.054/0001 001:14:054/ 6997K/ 903K ATM 0.0.0.0      
1:14:54-8.35-T-004048    0:08:15    0:00:00
616804033  001.14.054/0001 001:14:054/ 6997K/ 903K ATM 0.0.0.0      
1:14:54-8.40-T-004048    0:08:16    0:00:00616804034  001.14.055/0001
001:14:055/ 7997K/ 903K ATM 0.0.0.0         1:14:55-0.100-T-065997   0:08:17   
0:00:00
616804035  001.14.055/0001 001:14:055/ 7997K/ 903K ATM 0.0.0.0       
1:14:55-8.35-T-065997    0:08:17    0:00:00
616804036  001.14.055/0001 001:14:055/ 7997K/ 903K ATM 0.0.0.0      
1:14:55-8.40-T-065997    0:08:20    0:00:00
616804037  001.14.057/0001 001:14:057/ 2044K/ 252K ATM 0.0.0.0      
1:14:57-0.100-T-071069   0:08:20    0:00:00
616804038  001.14.057/0001 001:14:057/ 2044K/ 252K ATM 0.0.0.0      
1:14:57-8.35-T-071069    0:08:22    0:00:00
616804039  001.14.057/0001 001:14:057/ 2044K/ 252K ATM 0.0.0.0      
1:14:57-8.40-T-071069    0:08:23    0:00:00
616804040  001.14.059/0001 001:14:059/ 2044K/ 252K ATM 0.0.0.0      
1:14:59-0.100-T-155435   0:08:23    0:00:00
616804041  001.14.059/0001 001:14:059/ 2044K/ 252K ATM 0.0.0.0      
1:14:59-8.40-T-155435    0:08:24    0:00:00
616804048  001.14.050/0001 001:14:050/ 2044K/ 252K ATM 0.0.0.0      
1:14:50-0.100-T-064163   0:08:09    0:00:00
616804049  001.14.050/0001 001:14:050/ 2044K/ 252K ATM 0.0.0.0      
1:14:50-8.35-T-064163    0:08:08    0:00:00
616804050  001.14.050/0001 001:14:050/ 2044K/ 252K ATM 0.0.0.0      
1:14:50-8.40-T-064163    0:08:10    0:00:00
616804051  001.14.051/0001 001:14:051/   13M/1047K ATM 0.0.0.0      
1:14:51-0.100-T-080123   0:08:10    0:00:00
616804052  001.14.051/0001 001:14:051/   13M/1047K ATM 0.0.0.0      
1:14:51-8.35-T-080123    0:08:10    0:00:00
616804053  001.14.051/0001 001:14:051/   13M/1047K ATM 0.0.0.0      
1:14:51-8.40-T-080123    0:08:13    0:00:00
<end user list>  3050 active user(s)
mit HFDSKJKJR LIKLSS
BLAB HGFDO
COMPANY Telecom
DESEARCH DEVELOPEMENT Network Operation Center (NOC)
Donau-City-Strasse 11, 1220 Wien
service@atgljkfyh.com
******** WICHTIGER HINWEIS ********
balblablablbalbalnbabTele2bmlablablalablaba.
blablablablaba.
******** IMPORTANT NOTICE ********
blablablbalbablabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.
lablablbalablblb.

还值得注意的是,我有兴趣仅提取与我的第一篇文章中描述的结构匹配的信息。意思是具有以下形式的数据:

Key : value
key_n: value_n1...
       valume_mn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多