Я создаю простой синтаксический анализатор, который принимает запрос, подобный следующему: «показать коммиты fizi с 01.01.2010 по 02.11.2006». На данный момент у меня есть:
class QueryParser(object):
def parser(self, stmnt):
keywords = ["select", "from","to", "show","commits", "where", "group by", "order by", "and", "or"]
[select, _from, _to, show, commits, where, groupby, orderby, _and, _or] = [ CaselessKeyword(word) for word in keywords ]
user = Word(alphas+"."+alphas)
user2 = Combine(user + "'s")
startdate=self.getdate()
enddate=self.getdate()
bnf = (show|select)+(user|user2).setResultsName("user")+(commits).setResultsName("stats")\
+Optional(_from+startdate.setResultsName("start")+_to+enddate.setResultsName("end"))
a = bnf.parseString(stmnt)
return a
def getdate(self):
integer = Word(nums).setParseAction(lambda t: int(t[0]))
date = Combine(integer('year') + '/' + integer('month') + '/' + integer('day'))
#date.setParseAction(self.convertToDatetime)
return date
Я хотел бы, чтобы даты были более общими. Это означает, что пользователь может указать 20 января 2010 г. или другой формат даты. Я нашел хороший онлайн-анализ даты, который делает именно это. Он принимает дату в виде строки, а затем анализирует ее. Итак, что мне осталось, так это передать этой функции строку даты, которую я получаю от своего синтаксического анализатора. Как мне заняться токенизацией и захватом двух строк даты. На данный момент он фиксирует только формат 'y/m/d'. Есть ли способ просто получить всю строку независимо от того, как она отформатирована. Что-то вроде захвата слова сразу после ключевых слов и . Любая помощь приветствуется.
dateutil.parser.parse
на токене, который вы извлек. Также может быть полезно — в зависимости от остальной части грамматики — использовать строки в кавычках, такие какfrom "Jan 20" to "Apr 5"
или подобные, чтобы сделать токенизацию немного более явной, где требуется более гибкий (или неоднозначный) синтаксический анализ. - person Jon Clements♦   schedule 23.01.2015