如何用Lark规则匹配任意复杂玩家名称并提取对应字段值
你的代码存在几处核心问题,导致无法匹配格式复杂的玩家名称:
- 语法笔误:
SPACE规则和STRING_INNER规则被写在同一行,直接导致语法解析失败 - 玩家名匹配逻辑错误:错误将
Seat X:的后缀作为STRING_INNER的匹配前缀,且没有正确设置玩家名的终止边界,无法适配带特殊字符的玩家名称 - 词法规则设计不合理:座位号仅支持匹配1位数字、数字规则写法错误、空格处理逻辑冗余
修正后的完整可运行代码
from lark import Lark gram = r""" start: seats+ seats: "Seat" seat_position ":" player table_chips is_sitting_out? NL seat_position: NUMBER is_sitting_out: "is sitting out" table_chips: "(" chips "in chips" ("," chips "bounty")? ")" # 玩家名匹配规则:匹配所有字符直到遇到「空格+左括号」为止,适配所有特殊字符玩家名 player: /[^(]+(?=\s\()/ chips: "$"? (DECIMAL | NUMBERS) NUMBERS: /[0-9]+/ NUMBER: /[0-9]+/ DECIMAL: NUMBERS "." NUMBERS CR : /\r/ LF : /\n/ NL: (CR? LF)+ # 忽略常规空格,无需自行处理空格匹配 %ignore " " """ data = r""" Seat 1: Ruzzka(Rus) (1200 in chips) Seat 1: Dladik Rzs38 (1200 in chips) Seat 1: slum ^o_o^ (1200 in chips) Seat 1: é=mc² (1200 in chips) Seat 1: {’O_0`}/(nh) (1200 in chips) Seat 1: °ÆND0c42Z4y° (1200 in chips) Seat 1: $ salesovish (1200 in chips) """ parser = Lark(gram) tree = parser.parse(data) print(tree.pretty())
核心修正说明
- 新增
%ignore " "配置自动处理空格,不需要手动在规则里写空格匹配逻辑 - 玩家名规则改用正则前瞻匹配,终止边界设为筹码字段前的
(,只要玩家名本身不含(字符串就可以正常匹配,完全覆盖你给出的所有测试用例场景 - 修正了数字规则写法,座位号支持匹配多位数字
- 调整了规则结构,避免词法优先级冲突
内容的提问来源于stack exchange,提问作者na a
相关产品推荐
相关产品推荐

