2017-02-08 8 views
1

私はpython parsimoniousライブラリで複数行のテキストを解析しようとしています。私はしばらくそれをしてきたし、改行を効果的に処理する方法を理解することはできません。その一例を以下に示します。以下の動作は理にかなっています。私はErik Roseからthis commentを見かけましたが、間違いなく実装する方法は分かりませんでした。Parsimonious Pythonライブラリを使用して複数行のテキストを解析する

<Node called "bin" matching "FIRST something cool"> 
    <Node called "ORDER" matching "FIRST"> 
     <Node matching "FIRST"> 
    <RegexNode called "spaces" matching " "> 
    <RegexNode called "description" matching "something cool"> 

をしかし、複数行に問題を与え、私は上記のリンクに基づいて解決することができませんでした、print(grammar.parse(multiline_text)):シングルライン出力のためにうまく動作

ここに任意のヒントをありがとう...

singleline_text = '''\ 
FIRST something cool''' 

multiline_text = '''\ 
FIRST something very 
     cool 
SECOND more awesomeness   
''' 

grammar = Grammar(
    """ 
    bin   = ORDER spaces description 
    ORDER   = 'FIRST'/'SECOND' 
    spaces  = ~'\s*' 
    description = ~'[A-z0-9 ]*' 
    """) 
は、 print(grammar.parse(singleline_text))ができます与える:

:ここ

--------------------------------------------------------------------------- 
IncompleteParseError      Traceback (most recent call last) 
<ipython-input-123-c346891dc883> in <module>() 
----> 1 print(grammar.parse(multiline_text)) 

/Users/me/anaconda3/lib/python3.6/site-packages/parsimonious/grammar.py in parse(self, text, pos) 
    121   """ 
    122   self._check_default_rule() 
--> 123   return self.default_rule.parse(text, pos=pos) 
    124 
    125  def match(self, text, pos=0): 

/Users/me/anaconda3/lib/python3.6/site-packages/parsimonious/expressions.py in parse(self, text, pos) 
    110   node = self.match(text, pos=pos) 
    111   if node.end < len(text): 
--> 112    raise IncompleteParseError(text, node.end, self) 
    113   return node 
    114 

IncompleteParseError: Rule 'bin' matched in its entirety, but it didn't consume all the text. The non-matching portion of the text begins with ' 
     cool 
SECOND' (line 1, column 23). 

は動作しませんでした私が試した一つのことです

grammar2 = Grammar(
    """ 
    bin   = ORDER spaces description newline 
    ORDER   = 'FIRST'/'SECOND' 
    spaces  = ~'\s*' 
    description = ~'[A-z0-9 \n]*' 
    newline  = ~r'#[^\r\n]*' 
    """) 

print(grammar2.parse(multiline_text)) 

(211行のスタックトレースから切り捨て):

ERROR:root:An unexpected error occurred while tokenizing input 
The following traceback may be corrupted or invalid 
The error message is: ('EOF in multi-line string', (1, 4)) 

--------------------------------------------------------------------------- 
SyntaxError        Traceback (most recent call last) 

... 


VisitationError: SyntaxError: EOL while scanning string literal (<unknown>, line 1) 

Parse tree: 
<Node called "spaceless_literal" matching "'[A-z0-9 
]*'"> <-- *** We were here. *** 
    <RegexNode matching "'[A-z0-9 
    ]*'"> 

答えて

1

あなたの文法でビン要素を繰り返す必要のように見えます:

ものと
grammar = Grammar(
    r""" 
    one   = bin + 
    bin   = ORDER spaces description newline 
    ORDER   = 'FIRST'/'SECOND' 
    newline  = ~"\n*" 
    spaces  = ~"\s*" 
    description = ~"[A-z0-9 ]*"i 
    """) 

あなたは物事を解析することができますlike:

multiline_text = '''\ 
FIRST something very cool 
SECOND more awesomeness  
SECOND even better 
''' 
+0

これは、各行に1つのエントリの問題に対処するためにうまくいきます...ありがとうございます。私はあなたのヒントを使用してラッピングの問題に取り組んでいます。ここでは説明が複数の行にまたがる場合があります。 – Mark

関連する問題