如何使用Python的Lark解析带--->标记的文本段落
问题分析与修复方案
你的解析器未识别出section的核心问题有三点:
start规则采用section* | line*的歧义分支,Lark会优先尝试匹配line*(因你的section规则仅匹配标题行和后续两个换行,无法覆盖完整section结构,导致解析器 fallback 到line*分支)section规则仅定义了标题行,未包含该section对应的内容部分- 内容匹配规则未排除新的section起始行,无法正确划分section边界
修正后的语法与代码
from lark import Lark parser = Lark(r""" start: section* section: section_header content section_header: "---> " SECTION_TITLE "\n" SECTION_TITLE: "TITLE" | "CONTENT" | "SOURCE" | "OUTPUT" | "TEST" # 补充示例中出现的TEST类型 # 匹配所有不以--->开头的行,直到下一个section开头或文档结束 content: (NON_SECTION_LINE)+ NON_SECTION_LINE: /^(?!--->).*\n?/ """, start='start') with open("src/index.mdx") as _in: tree = parser.parse(_in.read()) print(tree.pretty())
关键调整说明
- 重新定义
start为section*,明确文档是多个section的序列,消除歧义 - 给
section补充content部分,让每个section完整包含标题和对应内容 - 用
(?!--->)否定前瞻正则,确保NON_SECTION_LINE不会匹配新的section起始行,正确划分每个section的边界 - 补充示例里的
TEST类型到SECTION_TITLE中,避免解析失败
测试你提供的示例文档,解析后的语法树会清晰拆分出每个section的标题和对应内容,不会再全部识别为ANY_LINE。
内容的提问来源于stack exchange,提问作者Alan W. Smith
相关产品推荐
相关产品推荐

