簡體   English   中英

非貪婪列表解析與pyparsing

[英]Non-greedy list parsing with pyparsing

我有一個字符串,由我試圖用pyparsing解析的單詞列表組成。

該列表始​​終至少有三個項目。 從這里我想要pyparsing生成三個組,第一組包含最后兩個項目的所有單詞,最后兩個組應該是最后兩個項目。 例如:

"one two three four"

應解析為類似的東西:

["one two"], "three", "four"

我可以用正則表達式做到這一點:

import pyparsing as pp
data = "one two three four"
grammar = pp.Regex(r"(?P<first>(\w+\W?)+)\s(?P<penultimate>\w+) (?P<ultimate>\w+)")
print(grammar.parseString(data).dump())

這使:

['one two three four']
- first: one two
- penultimate: three
- ultimate: four

我的問題是我沒有得到與非Regex ParserElement相同的結果,因為pyparsing貪婪的性質,例如以下:

import pyparsing as pp
data = "one two three four"
word = pp.Word(pp.alphas)
grammar = pp.Group(pp.OneOrMore(word))("first") + word("penultimate") + word("ultimate")
grammar.parseString(data)

跟蹤失敗:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/pyparsing.py", line 1125, in parseString
    raise exc
pyparsing.ParseException: Expected W:(abcd...) (at char 18), (line:1, col:19)

因為OneOrMore會啜飲列表中的所有單詞。 到目前為止,我嘗試使用FollowedBy或NotAny防止這種貪婪的行為失敗了 - 任何建議都是我如何獲得所需的行為?

好吧,你的OneOrMore表達只需要稍微收緊一點 - 你跟隨FollowedBy走在了正確的軌道上。 你真的不想要OneOrMore(單詞),你想要“OneOrMore(跟着至少2個單詞的單詞)”。 要將此類前瞻添加到pyparsing,您甚至可以使用新的'*'乘法運算符來指定前瞻計數:

grammar = pp.Group(pp.OneOrMore(word + pp.FollowedBy(word*2)))("first") + word("penultimate") + word("ultimate")

現在傾倒這個給出了所需的:

[['one', 'two'], 'three', 'four']
- first: ['one', 'two']
- penultimate: three
- ultimate: four

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM