From e578d09e1a120f812ac5baffcd550e0fa6dd98b8 Mon Sep 17 00:00:00 2001 From: Vasily Vlasov Date: Wed, 16 Oct 2019 12:18:12 +0300 Subject: [PATCH] add FEN-string validator based on regular expression --- fen_validator.py | 36 ++++++++++++++++++++++++++++++++++++ pystockfish.py | 8 ++++++++ 2 files changed, 44 insertions(+) create mode 100644 fen_validator.py diff --git a/fen_validator.py b/fen_validator.py new file mode 100644 index 0000000..81ac27b --- /dev/null +++ b/fen_validator.py @@ -0,0 +1,36 @@ +import re + +def fenPass(fen): + regexMatch=re.match('\s*^(((?:[rnbqkpRNBQKP1-8]+\/){7})[rnbqkpRNBQKP1-8]+)\s([b|w])\s([K|Q|k|q]{1,4})\s(-|[a-h][1-8])\s(\d+\s\d+)$', fen) + if regexMatch: + regexList = regexMatch.groups() + fen = regexList[0].split("/") + if len(fen) != 8: + raise ValueError("expected 8 rows in position part of fen: {0}".format(repr(fen))) + + for fenPart in fen: + field_sum = 0 + previous_was_digit, previous_was_piece = False,False + + for c in fenPart: + if c in ["1", "2", "3", "4", "5", "6", "7", "8"]: + if previous_was_digit: + raise ValueError("two subsequent digits in position part of fen: {0}".format(repr(fen))) + field_sum += int(c) + previous_was_digit = True + previous_was_piece = False + elif c == "~": + if not previous_was_piece: + raise ValueError("~ not after piece in position part of fen: {0}".format(repr(fen))) + previous_was_digit, previous_was_piece = False,False + elif c.lower() in ["p", "n", "b", "r", "q", "k"]: + field_sum += 1 + previous_was_digit = False + previous_was_piece = True + else: + raise ValueError("invalid character in position part of fen: {0}".format(repr(fen))) + + if field_sum != 8: + raise ValueError("expected 8 columns per row in position part of fen: {0}".format(repr(fen))) + + else: raise ValueError("fen doesn`t match follow this example: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 ") diff --git a/pystockfish.py b/pystockfish.py index 3da9fe8..22e8f4a 100644 --- a/pystockfish.py +++ b/pystockfish.py @@ -14,6 +14,9 @@ import re import subprocess from random import randint + +from fen_validator import fenPass + MAX_MOVES = 200 UCI_MOVE_REGEX = "[a-h]\d[a-h]\d[qrnb]?" PV_REGEX = " pv (?P{0}( {0})*)".format(UCI_MOVE_REGEX) @@ -195,6 +198,11 @@ def setfenposition(self, fen): """ set position in fen notation. Input is a FEN string i.e. "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1" """ + try: + fenPass(fen) + except ValueError as e: + print(e.message) + self.put('position fen %s' % fen) self.isready()