我想编写一个正则表达式,该正则表达式与象棋符号中的主教动作相匹配
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的含义恰好是该组的一个值。
答案 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
如果两个条件都成立,则可以应用正则表达式。