This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from parsimonious.grammar import Grammar | |
from parsimonious.nodes import NodeVisitor | |
class EntryParser(NodeVisitor): | |
def __init__(self, grammar, text): | |
self.entry = {} | |
ast = Grammar(grammar).parse(text) | |
self.visit(ast) | |
def visit_name(self, n, vc): | |
self.entry['name'] = n.text | |
def visit_gender(self, n, vc): | |
self.entry['gender'] = n.text | |
def visit_age(self, n, vc): | |
self.entry['age'] = n.text | |
def generic_visit(self, n, vc): | |
pass | |
grammar = """\ | |
entry = name sep gender? (sep age)? | |
sep = ws "," ws | |
ws = " "* | |
name = ~"[A-z]*" | |
gender = "male" / "female" | |
age = ~"[0-9]*" | |
""" | |
text = """\ | |
Bob, male, 26 | |
Kim,female,30 | |
Joe,male | |
""" | |
for line in text.splitlines(): | |
print EntryParser(grammar, line).entry |
The resulting output is the following:
{'gender': 'male', 'age': '26', 'name': 'Bob'} {'gender': 'female', 'age': '30', 'name': 'Kim'} {'gender': 'male', 'name': 'Joe'}
Thanks for this!
ReplyDeleteThanks for this!
ReplyDelete