Wybrałem pierwszą z brzegu, omówioną w wykładzie Erik Rose - "Parsing Horrible Things with Python":
Dokumentacja jest moim zdaniem kiepska (pierwszy link), ale następny link (wykład Paula McGuire) bardzo ułatwiły pracę:
- http://pyparsing.wikispaces.com/HowToUsePyparsing
- http://www.ptmcg.com/geo/python/confs/TxUnconf2008Pyparsing.html
pip install pyparsingPrzykład - wyciąganie liczby ze stringu, który może być wielokrotnie zamknięty za pomocą nawiasów < i >
import pyparsing as pp startMark = pp.Suppress(pp.Literal('<')) endMark = pp.Suppress(pp.Literal('>')) greet = pp.Word(pp.alphas + ',') value = pp.Word(pp.nums) lastContent = greet + value expr = pp.Forward() content = pp.Group(expr).setResultsName('Indent') | \ pp.Group(lastContent).setResultsName('Right Content') expr << startMark + content + endMark grammar = expr data = '<<Hello, 1337>>' res = grammar.parseString(data) print(res) print(type(res)) print(res[0].getName())Wynik:
[[['Hello,', '1337']]] <class 'pyparsing.ParseResults'> IndentDo budowania gramatyk, najlepiej korzystać z operatorów +, ^, |. Do dopasowania tekstu służy nam wiele obiektów (tokenów) np.
- Word - dopasowuje tekst z dowolnego złożenia znaków
- Literal - dopasowuje zwartość do znaków dokładnie w takiej kolejności jak zostały podane
- Suppress - dopasowuje, ale zawartość zostanie pominięta w wyniku
Group, pozwala na grupowanie wyników/tokenów jakie pojawią się w ostatecznym wyniku.
Słowo jeszcze o metodach, które okazały się w moim przypadku niezwykle przydane:
- delimitedList(expression, delim=',') - dopasuje wyrażenie, rozdzielone za pomocą delimitera (domyślnie jest to przecinek)
- Group.setResultsName() - nadaje nazwę do dopasowanego tokenu, ma niby posłużyć w celu zbudowania słownika ze sparsowanymi danymi, ale ja po prostu korzystam z getName() na wynikowych danych, gdy po nich iteruje
- ParseResults.asList() - wynik domyślnie jest obiektem ParseResult, ale możemy skorzystać z konwersji i przekształcić go na listę
Brak komentarzy:
Prześlij komentarz