我需要指定一个定义为ambn的表达式,以便:

  • m+n=tt是固定的
  • 0<=m<=t-1
  • 1

简化后的当前代码如下:

from pyparsing import Char, Combine

def ab(t):
  first = Char('a')[0, t - 1]
  second = Char('b')[1, t]
  
  expression = first + second
  expression.add_condition(
    lambda result: len(result) == t,
    message = f'Total length must be {t}'
  )
    
  return Combine(expression)

但是,该表达式会消耗它所能找到的所有内容,并在没有回溯的情况下对该结果调用条件函数.例如:

grammar = (ab(4) | Char('b'))[1, ...].set_name('grammar')
grammar.parse_string('abbbb', parse_all = True)
ParseException: Expected grammar, found 'abbbb'  (at char 0), (line:1, col:1)

我想要的结果是['abbb', 'b'],如果将所讨论的表达式指定为:

expression = Or([
  Char('a')[m] + Char('b')[t - m]
  for m in range(0, t)
])

...但这看起来不必要的冗长.

有没有更好的办法?

推荐答案

我重写了你的第二种方法,使用"|'运算符,以创建MatchFirst表达式而不是Or:

a = pp.Char('a')
b = pp.Char('b')

def ab(t):
    expr = b[t]
    for i in range(1, t):
        expr |= a[i] + b[t-i]
    return pp.Combine(expr)

它还使用b[t]定义第一个术语,并使用从1开始的范围,而不是默认的0.

然后我使用RUN_TESTS进行了测试:

ab5 = ab(5)
ab5.run_tests("""\
    bbbbb
    abbbb
    aabbb
    aaabb
    aaaab
    """)

ab4b = ab(4) + b
ab4b.run_tests("""\
    bbbbb
    abbbb
    aabbb
    aaabb
    """)

这两个表达式都给出了预期的结果.

使用条件的第一种方法失败的原因与您所说的完全相同--‘b’的重复不知道何时停止,因此它会读入‘b’之外的内容,而‘b’本应被解析为第二个术语.(与正则表达式不同,pyparsing不执行任何回溯).

因此,我没有使用条件,而是将ab()的b项改为a Forward,并向a项添加了一个解析操作,以便在b项中插入一个包含正确数量的b的表达式.

def ab(t):
    a_s = a[0, t-1]
    b_s = pp.Forward()
    expr = a_s + b_s

    def dynamic_b_term(a_chars):
        b_s << b[t - len(a_chars)]

    a_s.add_parse_action(dynamic_b_term)

    return pp.Combine(expr)

这也通过了ab(5)ab(4) + b的run_test.

Python相关问答推荐

如何从同一类的多个元素中抓取数据?

Django关于UniqueBindition的更新

键盘.任务组

这家einsum运营在做什么?E = NP.einsum(aj,kl-il,A,B)

在Windows上启动新Python项目的正确步骤顺序

ambda将时间戳与组内另一列的所有时间戳进行比较

如何防止Plotly在输出到PDF时减少行中的点数?

如何使用stride_tricks.as_strided逆转NumPy数组

计算所有前面行(当前行)中列的值

配置Sweetviz以分析对象类型列,而无需转换

Pydantic 2.7.0模型接受字符串日期时间或无

如何过滤包含2个指定子字符串的收件箱列名?

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

Python—从np.array中 Select 复杂的列子集

梯度下降:简化要素集的运行时间比原始要素集长

如何在Polars中从列表中的所有 struct 中 Select 字段?

导入...从...混乱

使用NeuralProphet绘制置信区间时出错

如何在Python中获取`Genericums`超级类型?

寻找Regex模式返回与我当前函数类似的结果