forked from chessai123/chess
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfenparser.py
33 lines (26 loc) · 835 Bytes
/
fenparser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from itertools import chain
import re
class FenParser():
def __init__(self, fen_str):
self.fen_str = fen_str
def parse(self):
ranks = self.fen_str.split(" ")[0].split("/")
pieces_on_all_ranks = [self.parse_rank(rank) for rank in ranks]
return pieces_on_all_ranks
def parse_rank(self, rank):
rank_re = re.compile("(\d|[kqbnrpKQBNRP])")
piece_tokens = rank_re.findall(rank)
pieces = self.flatten(map(self.expand_or_noop, piece_tokens))
return pieces
def flatten(self, lst):
return list(chain(*lst))
def expand_or_noop(self, piece_str):
piece_re = re.compile("([kqbnrpKQBNRP])")
retval = ""
if piece_re.match(piece_str):
retval = piece_str
else:
retval = self.expand(piece_str)
return retval
def expand(self, num_str):
return int(num_str)*" "