You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Lark解析粗体文本的示例失效,问题出在哪里?

问题原因与解决方案

问题根源

  1. 优先级设置颠倒:Lark 中规则的优先级数字越小,优先级越高。你给text标记了.1,bold_text标记了.2,导致text优先级更高,解析器会优先尝试匹配它。
  2. text规则过于宽泛:/.+/是贪婪正则,会直接把整个**test**字符串完整匹配为text,完全不给bold_text留下匹配的机会,因此不会触发歧义提示。

修正方案

方案一:调整优先级+限制text匹配范围

from lark import Lark

grammar = r'''
    start: bold_text | text
    bold_text.1: "**" text "**"  # 让bold_text优先级高于text
    text.2: /(?!\*\*).+/s  # 匹配不以**开头的任意内容,s模式支持换行匹配
'''

parser = Lark(grammar, start="start", debug=True, ambiguity="explicit")

text = r"""**test**"""
parsed = parser.parse(text)
print(parsed.pretty())

方案二:利用PEG顺序性优化规则

PEG语法会按顺序尝试规则,把bold_text放在前面,解析器会优先尝试匹配它:

from lark import Lark

grammar = r'''
    start: bold_text | text
    bold_text: "**" text "**"
    # 匹配不包含连续**的文本,支持单个*
    text: /(?:(?!\*\*).)+/s
'''

parser = Lark(grammar, start="start", debug=True, ambiguity="explicit")

text = r"""**test**"""
parsed = parser.parse(text)
print(parsed.pretty())

两种方案都能正确将**test**解析为bold_text,输出符合预期的树形结构。

内容的提问来源于stack exchange,提问作者Jonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:42:35