【问题标题】:How to generate all possible expressions satisfying a grammar如何生成满足语法的所有可能表达式
【发布时间】:2017-08-14 23:53:21
【问题描述】:

我的应用程序具有以下表达式的语法:

(FIND, SEARCH, Lookup) [a, the, an, for] ITEM [in, at] (NEST, SHELF, DESK)

圆括号“()”中的项目 - 必需,方括号中的项目是可选的,不带括号的单词是必需的。

对我来说简单的表达方式是:

  • 在 DESK 查找项目
  • 在 DESK 中查找项目
  • 在 NEST 中查找 ITEM
  • 在货架上搜索项目

是否有任何解析方法或库可以用来生成所有可能的组合?

【问题讨论】:

  • 你有没有尝试过?对于这样一个简单的问题,图书馆只会让生活变得更加艰难。请注意,您不解析任何东西,您生成短语。生成与解析相反,并且更简单。你有四组单词,必须从每个单词中选择一个单词。 (ITEM 是固定的并且始终存在。)四重嵌套循环怎么样?
  • 问题的标题至少也具有误导性。
  • 您绝对应该能够为此编写一个简单的嵌套循环或列表推导,但如果您想扩展到更大的序列 - 一个可能对您有帮助的库是 itertools

标签: python arrays parsing grammar


【解决方案1】:

Sjoerdanswer 指向exrex。由于您的表达式可以写为正则表达式,因此该库将执行此操作。

>>> import exrex
>>> list(exrex.generate(r'(FIND|SEARCH|Lookup)( a| the| an| for)? ITEM ( in| at)?( NEST| SHELF| DESK)'))
['FIND ITEM  NEST', 'FIND ITEM  SHELF', 'FIND ITEM  DESK', 'FIND ITEM  in NEST', 'FIND ITEM  in SHELF', 'FIND ITEM  in DESK', 'FIND ITEM  at NEST', 'FIND ITEM  at SHELF', 'FIND ITEM  at DESK', 'FIND a ITEM  NEST', 'FIND a ITEM  SHELF', 'FIND a ITEM  DESK', 'FIND a ITEM  in NEST', 'FIND a ITEM  in SHELF', 'FIND a ITEM  in DESK', 'FIND a ITEM  at NEST', 'FIND a ITEM  at SHELF', 'FIND a ITEM  at DESK', 'FIND the ITEM  NEST', 'FIND the ITEM  SHELF', 'FIND the ITEM  DESK', 'FIND the ITEM  in NEST', 'FIND the ITEM  in SHELF', 'FIND the ITEM  in DESK', 'FIND the ITEM  at NEST', 'FIND the ITEM  at SHELF', 'FIND the ITEM  at DESK', 'FIND an ITEM  NEST', 'FIND an ITEM  SHELF', 'FIND an ITEM  DESK', 'FIND an ITEM  in NEST', 'FIND an ITEM  in SHELF', 'FIND an ITEM  in DESK', 'FIND an ITEM  at NEST', 'FIND an ITEM  at SHELF', 'FIND an ITEM  at DESK', 'FIND for ITEM  NEST', 'FIND for ITEM  SHELF', 'FIND for ITEM  DESK', 'FIND for ITEM  in NEST', 'FIND for ITEM  in SHELF', 'FIND for ITEM  in DESK', 'FIND for ITEM  at NEST', 'FIND for ITEM  at SHELF', 'FIND for ITEM  at DESK', 'SEARCH ITEM  NEST', 'SEARCH ITEM  SHELF', 'SEARCH ITEM  DESK', 'SEARCH ITEM  in NEST', 'SEARCH ITEM  in SHELF', 'SEARCH ITEM  in DESK', 'SEARCH ITEM  at NEST', 'SEARCH ITEM  at SHELF', 'SEARCH ITEM  at DESK', 'SEARCH a ITEM  NEST', 'SEARCH a ITEM  SHELF', 'SEARCH a ITEM  DESK', 'SEARCH a ITEM  in NEST', 'SEARCH a ITEM  in SHELF', 'SEARCH a ITEM  in DESK', 'SEARCH a ITEM  at NEST', 'SEARCH a ITEM  at SHELF', 'SEARCH a ITEM  at DESK', 'SEARCH the ITEM  NEST', 'SEARCH the ITEM  SHELF', 'SEARCH the ITEM  DESK', 'SEARCH the ITEM  in NEST', 'SEARCH the ITEM  in SHELF', 'SEARCH the ITEM  in DESK', 'SEARCH the ITEM  at NEST', 'SEARCH the ITEM  at SHELF', 'SEARCH the ITEM  at DESK', 'SEARCH an ITEM  NEST', 'SEARCH an ITEM  SHELF', 'SEARCH an ITEM  DESK', 'SEARCH an ITEM  in NEST', 'SEARCH an ITEM  in SHELF', 'SEARCH an ITEM  in DESK', 'SEARCH an ITEM  at NEST', 'SEARCH an ITEM  at SHELF', 'SEARCH an ITEM  at DESK', 'SEARCH for ITEM  NEST', 'SEARCH for ITEM  SHELF', 'SEARCH for ITEM  DESK', 'SEARCH for ITEM  in NEST', 'SEARCH for ITEM  in SHELF', 'SEARCH for ITEM  in DESK', 'SEARCH for ITEM  at NEST', 'SEARCH for ITEM  at SHELF', 'SEARCH for ITEM  at DESK', 'Lookup ITEM  NEST', 'Lookup ITEM  SHELF', 'Lookup ITEM  DESK', 'Lookup ITEM  in NEST', 'Lookup ITEM  in SHELF', 'Lookup ITEM  in DESK', 'Lookup ITEM  at NEST', 'Lookup ITEM  at SHELF', 'Lookup ITEM  at DESK', 'Lookup a ITEM  NEST', 'Lookup a ITEM  SHELF', 'Lookup a ITEM  DESK', 'Lookup a ITEM  in NEST', 'Lookup a ITEM  in SHELF', 'Lookup a ITEM  in DESK', 'Lookup a ITEM  at NEST', 'Lookup a ITEM  at SHELF', 'Lookup a ITEM  at DESK', 'Lookup the ITEM  NEST', 'Lookup the ITEM  SHELF', 'Lookup the ITEM  DESK', 'Lookup the ITEM  in NEST', 'Lookup the ITEM  in SHELF', 'Lookup the ITEM  in DESK', 'Lookup the ITEM  at NEST', 'Lookup the ITEM  at SHELF', 'Lookup the ITEM  at DESK', 'Lookup an ITEM  NEST', 'Lookup an ITEM  SHELF', 'Lookup an ITEM  DESK', 'Lookup an ITEM  in NEST', 'Lookup an ITEM  in SHELF', 'Lookup an ITEM  in DESK', 'Lookup an ITEM  at NEST', 'Lookup an ITEM  at SHELF', 'Lookup an ITEM  at DESK', 'Lookup for ITEM  NEST', 'Lookup for ITEM  SHELF', 'Lookup for ITEM  DESK', 'Lookup for ITEM  in NEST', 'Lookup for ITEM  in SHELF', 'Lookup for ITEM  in DESK', 'Lookup for ITEM  at NEST', 'Lookup for ITEM  at SHELF', 'Lookup for ITEM  at DESK']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    相关资源
    最近更新 更多