如何解析PGN走法字符串?Python chess库报错求助
问题解决:解析PGN走法字符串并更新棋盘状态
错误原因
你当前的代码错误在于混淆了PGN代数走法符号和UCI格式走法:
- 你的
game.moves是PGN格式的走法串(包含回合标记如1.,走法如e4) chess.Move.from_uci()只接受UCI格式的走法(比如e2e4,长度4或5字符),直接split后会把1.这类回合标记传入,导致InvalidMoveError。
解决方案
方案1:直接用chess库的PGN解析器(推荐)
chess库自带完整的PGN解析功能,可以直接将PGN字符串转换成游戏对象,自动处理回合标记和走法:
import chess import chess.pgn from io import StringIO # 将走法字符串包装成标准PGN结构(必要的元数据可随意填充) pgn_content = f"""[Event "Game"] [Date "2024.01.01"] [Result "*"] {game.moves} """ # 解析PGN game = chess.pgn.read_game(StringIO(pgn_content)) board = game.board() # 遍历所有主线路走法并更新棋盘 for move in game.mainline_moves(): board.push(move)
方案2:手动过滤回合标记并解析PGN代数走法
如果只需要处理走法部分,先过滤掉回合标记,再用board.parse_san()解析PGN代数符号:
import re import chess board = chess.Board() # 移除所有回合标记(如1.、2.) clean_move_str = re.sub(r'\d+\.', '', game.moves).strip() for move_text in clean_move_str.split(): # 解析PGN代数走法(如e4、Nf3) move = board.parse_san(move_text) board.push(move)
关键区别
chess.Move.from_uci(uci_str):解析UCI格式走法(位置到位置,如e2e4)board.parse_san(san_str):解析PGN代数符号(如e4、Nf3),依赖当前棋盘状态判断具体走法
内容的提问来源于stack exchange,提问作者vladimirOmSu
相关产品推荐
相关产品推荐

