Можно ли сравнить одну часть матча с другой? - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу написать регулярное выражение, соответствующее ходу слона в шахматной нотации, например B<from><to>.Например, Ba1c3

^B[a-h][1-8][a-h][1-8]$ не будет работать.Епископ всегда должен оставаться по диагонали.Значит Ba1c2 недействительно.Есть ли способ математически сравнить <from> и <to> с регулярным выражением?Что-то вроде B([a-h])([1-8])\1+1\2+1.+1 означает, что это на одно значение больше, чем группа.

1 Ответ

0 голосов
/ 21 декабря 2018

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])

Если оба условия выполняются, мы можем применить наше регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...