2017-09-22 14 views
1

私は、通常、以下の構造を持つ特定の入力テキストの内容を抽出するためにpyparsing apiを使用しています。複数行のテキストをpyparsingに一致させる

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 

私が上記の例のような長い値を持つキーを持つとき、私は常に最初の行の内容しか持っていません。

このBNFは私pyparsingのために定義されています

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

キーと値が同じ行に書かれているとき、私は良い結果を持っています。

何か助けを歓迎し、事前にお礼します。

+0

これらのキーと値はすべて、改行なしで1行に書かれているとします。どのようにキーと値の違いを教えてください? – PaulMcG

+0

また、人々がスペースを置く場所や置かない場所、特にこれらのすべてにとって重要な '': '' 'の周りにどのようにして寛容/不耐性を望みますか? – PaulMcG

+0

スマートな答えをありがとう。区切り文字は、 ":" sympolを含む斬新な行です。 あなたの2番目の質問については、空白だけを意味するのか、斬新な行に戻ることを意味しますか? – Djo

答えて

1

私は、私の答えは準最適であると結論づけています。しかし、私は、pyparsingを使って解くことができる問題を試すのが大好きです。

これを行う1つの方法は、「値」は「キー」がある間に空白とコロンを持たないものです。したがって、私は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を使用してのタックをとっている可能性があり、そこに内蔵されていることを私に起こりました。

+0

'key_ending'から' pp.ZeroOrMore( '') 'を削除しても問題ありません。 – PaulMcG

+0

@PaulMcG:ありがとうございます。 –

+0

ありがとう、Bill Bell。私はあなたのコードを試したが、私は結果として何も持っていない!私は別のテキストの例で試してみましたが、私はいつも空の結果を持っています。 – Djo

0

私は、次の例で試してみましたすべての結果があります。私が私の最初の記事で説明した構造と一致するだけの情報を抽出することが興味を持っていることを言及することも注目すべきである

From: Blabla bhlkf <[email protected]> 
Sent: 2014-01-22 14:21:31 
To: "[email protected]" <[email protected]> 
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-08: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-08: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-08: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 
[email protected] 
******** WICHTIGER HINWEIS ******** 
balblablablbalbalnbabTele2bmlablablalablaba. 
blablablablaba. 
******** IMPORTANT NOTICE ******** 
blablablbalbablabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb. 
lablablbalablblb. 

を..

Key : value 
key_n: value_n1... 
     valume_mn 
関連する問題