2

昨日、これと同様の質問を投稿しました: Python Regex Named Groups。この作業は、単純なものにはかなり適しています。

いくつかの調査の後、私はpyparsingライブラリについて読みました.pyparsingライブラリは私の仕事にぴったりだと思われます.

text = '[@a eee, fff fff, ggg @b eee, fff, ggg @c eee eee, fff fff,ggg ggg@d]'
command_s = Suppress(Optional('[') + Literal('@'))
command_e = Suppress(Literal('@') | Literal(']'))
task = Word(alphas)
arguments = ZeroOrMore(
    Word(alphas) + 
    Suppress(
        Optional(Literal(',') + White()) | Optional(White() + Literal('@'))
    )
)
command = Group(OneOrMore(command_s + task + arguments + command_e))
print command.parseString(text)

# which outputs only the first @a sequence
# [['a', 'eee', 'fff', 'fff', 'ggg']]

# the structure should be someting like:
[
     ['a', 'eee', 'fff fff', 'ggg'],
     ['b', 'eee', 'fff', 'ggg'],
     ['c', 'eee eee', 'fff fff', 'ggg ggg'],
     ['d']
]

@ はシーケンスの開始を示します。最初の単語はタスク (a) で、その後にオプションのコンマ区切りの引数 (eee、fff fff、ggg) が続きます。問題は、上記のコードでは @b、@c、および @d が無視されることです。また、「fff fff」は 2 つの別個の引数として扱われるため、1 つだけにする必要があります。

4

1 に答える 1

4

埋め込まれたコメントを参照してください。

text = '[@a eee, fff fff, ggg @b eee, fff, ggg @c eee eee, fff fff,ggg ggg@d]'

from pyparsing import *

LBRACK,RBRACK,AT = map(Suppress,"[]@")

key = AT + Word(alphas)

# use originalTextFor to preserve whitespace between words between commas
list_item = originalTextFor(OneOrMore(Word(alphas)))

# define a key_value pair using Group to preserve structure
key_value = Group(key + Optional(delimitedList(list_item)))

parser = LBRACK + OneOrMore(key_value) + RBRACK
print parser.parseString(text)

これにより、目的の出力が印刷されます。

[['a', 'eee', 'fff fff', 'ggg'], 
 ['b', 'eee', 'fff', 'ggg'], 
 ['c', 'eee eee', 'fff fff', 'ggg ggg'], 
 ['d']]

追加のクレジットとして、pyparsing でキーを定義する方法を次に示します。

# Extra credit:
# use Dict to auto-define named groups using each '@x' as a key
parser = LBRACK + Dict(OneOrMore(key_value)) + RBRACK
result = parser.parseString(text)

# print the parsed keys
print result.keys()

# print a value for a particular key
print result['c']

# print a value for a particular key using object notation
print result.b

# dump out the whole structure to see just what we got
print result.dump()

版画

['a', 'c', 'b', 'd']
['eee eee', 'fff fff', 'ggg ggg']
['eee', 'fff', 'ggg']
[['a', 'eee', 'fff fff', 'ggg'], ['b', 'eee', 'fff', 'ggg'], ['c', 'eee eee', 'fff fff', 'ggg ggg'], ['d']]
- a: ['eee', 'fff fff', 'ggg']
- b: ['eee', 'fff', 'ggg']
- c: ['eee eee', 'fff fff', 'ggg ggg']
- d: 
于 2013-01-02T17:33:15.080 に答える