[英]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.