提取由空行包围的文件块

2024-06-25 23:35:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图提取给定文件中每个[EventDate]标记后面的代码块。这些都以1开头,以不同的数字结尾。下面的示例从1开始,到46和50结束。。每个文件中有2个以上的文件

这样做的目的是计算每个代码块的移动次数。在这种情况下,第一个块为46,第二个块为50。一旦我提取了块,我将能够计算句点“.”以获得移动的总数

[Event "9th Masters Final 2016"]
[Site "Bilbao ESP"]
[Date "2016.07.13"]
[Round "1.1"]
[White "Karjakin, Sergey"]
[Black "So, Wesley"]
[Result "1/2-1/2"]
[WhiteTitle "GM"]
[BlackTitle "GM"]
[WhiteElo "2773"]
[BlackElo "2770"]
[ECO "C65"]
[Opening "Ruy Lopez"]
[Variation "Berlin defence"]
[WhiteFideId "14109603"]
[BlackFideId "5202213"]
[EventDate "2016.07.13"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 Nf6 4. d3 Bc5 5. c3 O-O 6. O-O d6 7. h3 Ne7 8. d4 Bb6
9. Bd3 Ng6 10. Re1 Re8 11. Nbd2 c6 12. Nf1 d5 13. Bg5 dxe4 14. Rxe4 h6 15. Bxf6
Qxf6 16. Re3 Bf5 17. Bxf5 Qxf5 18. Ng3 Qd7 19. Nxe5 Nxe5 20. Rxe5 Rxe5 21. dxe5
Qe7 22. Qh5 g6 23. Qe2 Qg5 24. Kf1 Kf8 25. Re1 Re8 26. Qd3 Rxe5 27. Qd6+ Re7 28.
Ne4 Qf5 29. Re2 Bc7 30. Qd4 Qe5 31. Qxa7 Qh2 32. Ng3 Bxg3 33. Rxe7 Qh1+ 34. Ke2
Kxe7 35. Qe3+ Kf6 36. Qxg3 Qb1 37. Qf4+ Kg7 38. Qd4+ Kg8 39. Qb4 Qxa2 40. Qxb7
Qc4+ 41. Ke3 Qc5+ 42. Kf3 Qd5+ 43. Kg3 Qg5+ 44. Kh2 Qf4+ 45. Kg1 Qc1+ 46. Kh2
Qf4+ 1/2-1/2

[Event "9th Masters Final 2016"]
[Site "Bilbao ESP"]
[Date "2016.07.13"]
[Round "1.2"]
[White "Carlsen, Magnus"]
[Black "Nakamura, Hikaru"]
[Result "0-1"]
[WhiteTitle "GM"]
[BlackTitle "GM"]
[WhiteElo "2855"]
[BlackElo "2787"]
[ECO "B20"]
[Opening "Sicilian"]
[Variation "Keres variation (2.Ne2)"]
[WhiteFideId "1503014"]
[BlackFideId "2016192"]
[EventDate "2016.07.13"]

1. e4 c5 2. Ne2 d6 3. Nbc3 a6 4. g3 g6 5. Bg2 Bg7 6. d4 cxd4 7. Nxd4 Nf6 8. O-O
O-O 9. b3 Nc6 10. Nxc6 bxc6 11. Bb2 Qa5 12. Na4 Bg4 13. Qe1 Qh5 14. f3 Bh3 15.
g4 Qh6 16. Rd1 g5 17. Bc1 Bxg2 18. Kxg2 Qg6 19. h4 gxh4 20. Qxh4 d5 21. g5 dxe4
22. f4 e6 23. c4 Rfd8 24. Rde1 Ne8 25. Nc5 Nd6 26. Qf2 f5 27. Bb2 Nf7 28. Bxg7
Kxg7 29. Qg3 Rd6 30. Rd1 Rad8 31. Rxd6 Rxd6 32. Qc3+ Kg8 33. Rf2 Qh5 34. Qh3 Qd1
35. Qe3 e5 36. Qg3 Rg6 37. Kh2 exf4 38. Qxf4 Qh5+ 39. Kg1 Qd1+ 40. Kh2 Qh5+ 41.
Kg1 Nxg5 42. Qb8+ Kg7 43. Qe5+ Kh6 44. Qf4 Qd1+ 45. Kh2 Qd4 46. b4 Kg7 47. Qc7+
Kh8 48. Qc8+ Rg8 49. Qxf5 Nf3+ 50. Kh3 Qd6 0-1

Tags: 文件代码eventfinalgmmasterseventdatekh2
1条回答
网友
1楼 · 发布于 2024-06-25 23:35:01

您提供的两个游戏的示例实际上是一种称为PGN(便携式游戏符号)的标准格式。你可以在wikipedia PGN article上阅读更多关于它的信息。这一点很重要,因为pypihere上列出的名为pgnparser的库中已经存在pgn的python解析器。如果您对安装pgnparser库感到满意,那么可以将此任务简化。如果您的python安装已经使用pip进行了设置,那么安装本身就像运行pip install pgnparser一样简单。我假设您已经安装了pgnparser库,并且将两个示例游戏放入名为example_games.pgn的文件中

import pgn # The pgnparser library.

with open('example_games.pgn') as f:
    games = pgn.loads(f.read())

print(games)

将在文件中打印游戏

[<PGNGame "Karjakin, Sergey" vs "So, Wesley">,
 <PGNGame "Carlsen, Magnus" vs "Nakamura, Hikaru">]

要获得每场游戏中的移动次数,只需对其进行迭代即可

for game in games:
    msg = "{} vs {}, {} moves."
    print(msg.format(game.white, game.black, len(game.moves)))

这会打印出文件中每个游戏的摘要

Karjakin, Sergey vs So, Wesley, 93 moves.
Carlsen, Magnus vs Nakamura, Hikaru, 101 moves.

如果您的目标是获得移动次数,那么这将是一种高效、干净且面向对象的方法

相关问题 更多 >