首页 > 解决方案 > 解析 PGN 字符串以数字开头

问题描述

大家好,我是 python 新手,尝试学习如何从 PGN 解析字符串。

'[ECO "B08"]',
 '',
 '1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4',
 '9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5 12.Nb5 c6 13.Nc7 Rb8 14.f4 Ng4 15.Bxg4 Bd4+',
 '16.Kh1 Bb6 17.f5 Bxc7 18.fxg6 fxg6 19.Bh6 Be5 20.Rad1 Rxd1 21.Rxd1 Bd6 22.Rf1  1-0',
 '',
 '[Event "Telechess ol1 7778"]',

我想要的结果只是将移动部分放入列表中

1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4,9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5 12.Nb5 c6 13.Nc7 Rb8 14.f4 Ng4 15.Bxg4 Bd4+ 16.Kh1 Bb6 17.f5 Bxc7 18.fxg6 fxg6 19.Bh6 Be5 20.Rad1 Rxd1 21.Rxd1 Bd6 22.Rf1

我采用的方法是阅读 PGN 并按'\n'. 输出包含一个列表作为第一个代码块。我想检测以数字开头的每个列表(点“。”之前的一位或两位数)应该附加到一个新列表中。

粗略的代码应该是这样的

listmove = []
for i in pgn:
if i.startswith(1digitnumber or twodigitnumber before dot):
listmove.append[i]

可能吗?指导将有很大帮助,我们将不胜感激。

标签: pythonchess

解决方案


您可能感兴趣的最短的可理解行应至少为 4 个字符(移动编号、移动符号)。因此,您可以自由地检查这些第一个字符的初始有效性,即使是索引 100 或更多的移动。

在某个阶段,您可能会遇到以黑棋开头的线条,但我相信它们仍然以数字开头。('15. ... Bd4+')

由于早期版本引起了一些混乱,因此这个版本将第一个字符测试与后续更明确地分开:

def good_moves_start(pgnline):
    if len(pgnline) < 4:
        return False
    if pgnline[0] not in '123456789': # first char test
        return False
    for ch in pgnline[1:4]:
        if ch == '.':
            return True               # dot completes move #
        elif not ch.isdecimal():
            return False              # disqual characater
    return False                      # no dot in first 4 chars

这当然只识别候选移动数据;读入移动时,可能会进行更多验证。考虑如何允许拼图板和国际象棋变体 - 棋子、棋盘、移动、玩家数量会很有趣。


推荐阅读