3

私はファイルを持っていて、その一部は次のようになっています。

string                     0            1           10
string with white space    0            10          30
string9 with number 9      10           20          50
string_ with underline     10           50          1
(string with parentese)    50           20          100

各行を次のように解析する必要があります。

[[string, 0 ,1 ,10], ....]

上で見ることができるように、最初の部分はほとんど何でもありえます、そしてこれを解析することを考えることができる唯一の方法は私が2つの空白文字を持っているまで何でも受け入れることです、そしてそれはただの数字です。

しかし、私はこの「UNTIL」機能をpyparsingドキュメントで見つけることができません。

4

2 に答える 2

3

次のコードサンプルは、必要なものを実現します(@PaulMcGuireによって提案された以前のバージョンよりも改善されています)。

from __future__ import print_function

from pyparsing import CharsNotIn, Group, LineEnd, OneOrMore, Word, ZeroOrMore
from pyparsing import delimitedList, nums 

SPACE_CHARS = ' \t'
word = CharsNotIn(SPACE_CHARS)
space = Word(SPACE_CHARS, exact=1)
label = delimitedList(word, delim=space, combine=True)
# an alternative contruction for 'label' could be:
# label = Combine(word + ZeroOrMore(space + word))
value = Word(nums)
line = label('label') + Group(OneOrMore(value))('values') + LineEnd().suppress()

text = """
string                     0            1           10
string with white space    0            10          30
string9 with number 9      10           20          50
string_ with underline     10           50          1
(string with parentese)    50           20          100
""".strip()

print('input text:\n', text, '\nparsed text:\n', sep='\n')
for line_tokens, start_location, end_location in line.scanString(text):
    print(line_tokens.dump())

次の出力を提供します。

input text:

string                     0            1           10
string with white space    0            10          30
string9 with number 9      10           20          50
string_ with underline     10           50          1
(string with parentese)    50           20          100

parsed text:

['string', ['0', '1', '10']]
- label: string
- values: ['0', '1', '10']
['string with white space', ['0', '10', '30']]
- label: string with white space
- values: ['0', '10', '30']
['string9 with number 9', ['10', '20', '50']]
- label: string9 with number 9
- values: ['10', '20', '50']
['string_ with underline', ['10', '50', '1']]
- label: string_ with underline
- values: ['10', '50', '1']
['(string with parentese)', ['50', '20', '100']]
- label: (string with parentese)
- values: ['50', '20', '100']

label解析された値は、最初の列(上記の例で名前が付けられた)をキーとして、残りの列(values上記の名前)のリストを次のdict理解度の値として持つ辞書として取得できます。

{label: values.asList() for label, values in line.searchString(text)}

ここでline、およびtextは上記の例の変数であり、次の結果を生成します。

{'(string with parentese)': ['50', '20', '100'],
 'string': ['0', '1', '10'],
 'string with white space': ['0', '10', '30'],
 'string9 with number 9': ['10', '20', '50'],
 'string_ with underline': ['10', '50', '1']}
于 2012-10-19T19:05:48.460 に答える
2

完全を期すために、これはを使用しませんpyparsing

import re
lines   = re.compile("\r?\n").split(text)
pattern = re.compile("\s\s+")
for line in lines:
  print pattern.split(line)
#['string', '0', '1', '10']
#['string with white space', '0', '10', '30']
#['string9 with number 9', '10', '20', '50']
#['string_ with underline', '10', '50', '1']
#['(string with parentese)', '50', '20', '100']
于 2012-10-20T14:16:28.090 に答える