我正在构建一个简单的解析器,它接受如下查询:
'显示 fizi 从 2010 年 1 月 1 日到 2006 年 2 月 11 日的提交'
到目前为止我有:
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 Jan, 2010 或其他日期格式。我在网上找到了一个很好的日期解析工具,它正是这样做的。它将日期作为字符串,然后对其进行解析。所以我剩下的就是向该函数提供从解析器获得的日期字符串。我如何去标记和捕获两个日期字符串。目前它仅捕获“y/m/d”格式。有没有办法只获取整个字符串,无论其格式如何。比如捕获关键字和之后的单词。任何帮助是极大的赞赏。