是否可以将比赛的一部分与另一部分进行比较?

时间:2018-12-20 15:19:00

标签: python regex math

我想编写一个正则表达式,该正则表达式与象棋符号中的主教动作相匹配 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 :(得分:1)

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(),它返回给定char的Unicode整数:

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范围之外的数字,也不接受ah之外的字母,因此数字应在该范围之内,并且字符的ord()-96应该在{{1 }}是a)还应该:

97

如果两个条件都成立,则可以应用正则表达式。