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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:06:11