python - 解析 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]
可能吗?指导将有很大帮助,我们将不胜感激。
解决方案
您可能感兴趣的最短的可理解行应至少为 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
这当然只识别候选移动数据;读入移动时,可能会进行更多验证。考虑如何允许拼图板和国际象棋变体 - 棋子、棋盘、移动、玩家数量会很有趣。
推荐阅读
- python - 403 Authorization_RequestDenied 尝试读取用户时
- python - 这个 tensorflow 示例是否正确 - 我的 Dense 参数是否正确?
- django - Django Querysets - 包括多对多中的整个集合的对象
- c# - 如何在不使用电子邮件界面但使用 Yahoo SMTP 的情况下从 UWP/Windows Store 应用程序(2019)发送点击事件的自动电子邮件
- java - 如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个
- json - Golang中需要使用url参数查询Json数据
- android - 毕加索图像自行旋转
- python - 无法弄清楚这段代码的作用
- javascript - 当用户更新输入时,如何让 AngularJS 1.6 一次调用一个函数
- python-3.x - 如何为在键盘中断之前运行并且不返回任何内容的类编写单元测试?