RegEx - определенно неправильный инструмент для выполнения этой операции;Я предлагаю вам проверить строку с условием if/else
и списком, а затем использовать регулярное выражение, если результат верен:
import re
move = 'Be4c2'
valid_move = True if ((ord(move[1]) - ord(move[3])) == (int(move[2]) - int(move[4])) and all((0 <= int(x) <= 8 if x.isdigit() else ord(x) -96 for x in move[1:5]))) else False
if valid_move:
start, stop = re.findall(r'[a-h][1-8]', move)
print start, stop
else:
print "Wrong move"
# OUTPUT: e4 c2
Регулярное выражение теперь довольно просто.
Для if
условие, мы используем ord()
, которое возвращает unicode int для данного символа:
print ord("a") # 97
print ord("b") # 98
print ord("c") # 99
# ...
Мы также знаем, что слон может двигаться только по диагонали, поэтому разница от горизонтального расстояния должна бытьравно расстоянию по вертикали, поэтому в нашем if
состоянии мы имеем:
(ord(move[1]) - ord(move[3])) == (int(move[2]) - int(move[4])
Мы также не принимаем число вне диапазона 1-8 и буквы вне ах, поэтому числа должнынаходиться внутри этого диапазона, и ord()
символов (-96
, поскольку a
равно 97
) также должны:
(0 <= int(x) <= 8 if x.isdigit() else ord(x) -96 for x in move[1:5])
Если оба условия выполняются, мы можем применить наше регулярное выражение.