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

Python去除国际象棋走法字符串编号的最Pythonic实现方法

国际象棋走法字符串移除序号的实现方案

关于.replace()方法的可行性结论

单纯使用.replace()无法优雅完成这个需求:对局步数是不固定的,短对局可能只有十几步,长对局会上百步,你不可能提前枚举所有1.、2....100.的序号组合逐个替换,这种写法可维护性几乎为0。

推荐实现方案

最简洁的Pythonic写法

用标准库的正则模块一次性匹配替换所有序号是最干净的方案,仅需一行核心处理逻辑:

import re

raw_str = "1. d4 Nf6 2. c4 c5 3. d5 e6 4. Nc3 exd5 5. cxd5 d6 6. e4 g6 7. Bg5 Bg7 8. Bd3 O-O 9. Nge2 a6 10. a4 Nbd7 11. O-O Ne5 12. Bc2 Bg4 13. h3 Bxe2 14. Qxe2 Qc7 15. f4 Ned7 16. e5 dxe5 17. fxe5 Nh5 18. d6 Qb6 19. Nd5 Qxb2 20. Ne7+ Kh8 21. Rab1 Qxe5 22. Qxe5 Nxe5 23. Rxb7 Rad8 24. Rd1 f6 25. Be3 Nd7 26. Bd3 a5 27. Bd2 Ne5 28. Be4 Rxd6 29. Nd5 f5 30. Nc3 fxe4 31. Nxe4 Rdd8 32. Rc1 Nd3 33. Rc2 Bd4+ 34. Kh2 Nf2"
# 匹配「1个或多个数字 + 英文点 + 空格」的序号格式,全部替换为空
clean_str = re.sub(r"\d+\. ", "", raw_str)

处理后得到的clean_str就是你需要的无编号纯走法内容:

d4 Nf6 c4 c5 d5 e6 exd5 cxd5 d6 e4 g6 Bg5 Bg7 Bd3 O-O Nge2 a6 a4 Nbd7 O-O Ne5 Bc2 Bg4 h3 Bxe2 Qxe2 Qc7 f4 Ned7 e5 dxe5 fxe5 Nh5 d6 Qb6 Nd5 Qxb2 Ne7+ Kh8 Rab1 Qxe5 Qxe5 Nxe5 Rxb7 Rad8 Rd1 f6 Be3 Nd7 Bd3 a5 Bd2 Ne5 Be4 Rxd6 Nd5 f5 Nc3 fxe4 Nxe4 Rdd8 Rc1 Nd3 Rc2 Bd4+ Kh2 Nf2

适合初学者的无正则写法

如果你暂时还不熟悉正则语法,也可以通过字符串拆分+列表过滤的方式实现,逻辑非常直白:

raw_str = "1. d4 Nf6 2. c4 c5 3. d5 e6 4. Nc3 exd5 5. cxd5 d6 6. e4 g6 7. Bg5 Bg7 8. Bd3 O-O 9. Nge2 a6 10. a4 Nbd7 11. O-O Ne5 12. Bc2 Bg4 13. h3 Bxe2 14. Qxe2 Qc7 15. f4 Ned7 16. e5 dxe5 17. fxe5 Nh5 18. d6 Qb6 19. Nd5 Qxb2 20. Ne7+ Kh8 21. Rab1 Qxe5 22. Qxe5 Nxe5 23. Rxb7 Rad8 24. Rd1 f6 25. Be3 Nd7 26. Bd3 a5 27. Bd2 Ne5 28. Be4 Rxd6 29. Nd5 f5 30. Nc3 fxe4 31. Nxe4 Rdd8 32. Rc1 Nd3 33. Rc2 Bd4+ 34. Kh2 Nf2"
# 按空格拆分字符串为片段列表
str_parts = raw_str.split()
# 过滤掉所有以.结尾的序号片段,剩余的就是纯走法
move_parts = [part for part in str_parts if not part.endswith(".")]
# 用空格把走法拼接回字符串
clean_str = " ".join(move_parts)

这个写法不需要引入额外模块,逻辑和日常处理文本的思路完全一致,运行结果和正则方案完全相同。


内容的提问来源于stack exchange,提问作者Laith Tahboub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:54:30