44 lines
893 B
Python
44 lines
893 B
Python
"""
|
|
https://github.com/tlehman/fenparser
|
|
"""
|
|
|
|
|
|
import re
|
|
from itertools import chain
|
|
|
|
|
|
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(r"(\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(r"([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)*" "
|