是否有用于自定义自动完成的Python库?

时间:2011-07-27 12:25:11

标签: python parsing user-interface autocomplete grammar

是否有通用库允许我根据自定义语法和项目列表进行自动完成?

这是我正在寻找的一个例子。

语法:

  • 你可以吃苹果和芒果
  • 你可以喝牛奶和水
  • 你可以移动一切
  • 句子结构:动词[+形容词] +对象

产品:

  • 1个青苹果
  • 1个微观苹果
  • 1个芒果芒果
  • 1个黄色芒果
  • 1芒果[没有给出颜色]
  • 1牛奶
  • 1水

预期的行为(第一行的用户输入,第二行的建议)

m
move, munch

mo
move

move g
move green apple, move green mango

move y
move yellow mango

move m
move milk, move mango, move microscopic apple

2 个答案:

答案 0 :(得分:2)

我知道的一个自动完成模块是Qt的QCompleter,你可以通过PyQt或PySide在Python中使用它。我不认为它以你的意思理解语法,但它足够通用,允许你编写代码。

答案 1 :(得分:2)

我终于通过使用SPARK(用于语法分析/句法分析)和我自己的自动完成代码的组合找到了一个可接受的解决方案。

关于SPARK

  

SPARK代表扫描,分析和重写套件。它以前   没有名字,被称为“小语言框架”。   在第7届国际Python大会的论文Compiling Little Languages in Python中描述了第一个版本(大约1998年)。

     

SPARK采用100%纯Python编写,并以开放方式提供   源。

自动填充代码

在以下代码中:

  • category是我们自动填充的词。这是通过解析当前命令行获得的。例如:如果用户正在键入“drink m”,则解析器将知道在语法中定义的“液体”类别中的单词。
  • 用户输入存储在列表(self.chars
  • _get_list_of_existing()返回给定类别中现有字词的列表
  • _get_common_beginning()返回 - 如果可用 - 多个匹配的最长初始超级序列。例如,如果用户输入正在写“ma”并且可能的自动填充词是 [玉兰花,放大镜] _get_common_beginning()将返回“magn”

以下是相关的代码段:

def autocomplete(self, category):
    '''
    If possible, autocomplete a word according to its category.
    '''
    root = ''.join(self.chars).split()[-1]  #The bit after the last space
    pool = self._get_list_of_existing(category)
    matches = [i for i in pool if i.find(root) == 0]
    if len(matches) == 1:
        match = matches[0]+' '
    elif len(matches) > 1:
        match = self._get_common_beginning(matches)
    else:
        return
    self.chars.extend(list(match[len(root):]))

def _get_common_beginning(self, strings):
    '''
    Return the strings that is common to the beginning of each string in
    the strings list.
    '''
    result = []
    limit = min([len(s) for s in strings])
    for i in range(limit):
        chs = set([s[i] for s in strings])
        if len(chs) == 1:
            result.append(chs.pop())
        else:
            break
    return ''.join(result)