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

Python 是否可以将比赛的一部分与另一部分进行比较?,python,regex,math,Python,Regex,Math,我想写一个正则表达式,它与国际象棋符号中的主教移动相匹配,比如 B。例如,Ba1c3 ^B[a-h][1-8][a-h][1-8]$不起作用。主教应该始终站在对角线上。表示Ba1c2无效。有没有办法用正则表达式对和进行数学比较?类似于B([a-h])([1-8])\1+1\2+1+1意思是正好比组大一个值。RegEx绝对是执行此操作的错误工具;我建议您使用if/else条件和列表理解来验证字符串,如果结果有效,则使用正则表达式: import re move = 'Be4c2' valid

我想写一个正则表达式,它与国际象棋符号中的主教移动相匹配,比如
B
。例如,
Ba1c3


^B[a-h][1-8][a-h][1-8]$
不起作用。主教应该始终站在对角线上。表示
Ba1c2
无效。有没有办法用正则表达式对
进行数学比较?类似于
B([a-h])([1-8])\1+1\2+1
+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(move[1]) - ord(move[3])) == (int(move[2]) - int(move[4])
我们也不接受1-8范围外的数字和a-h范围外的字母,因此数字应该在该范围内,字符的
ord()
-96
,因为
a
97
)也应该:

(0 <= int(x) <= 8 if x.isdigit() else ord(x) -96 for x in move[1:5])

(0我认为单用正则表达式无法做到这一点,但使用正则表达式可以提取数字成分,然后用Python进行计算。为什么要将数字限制为
8
,而不是
h
?您始终可以枚举有效的移动:
^Ba1(b2 | c3 | d4 | e5 | f6 | g7 | h8)$
。用于匹配“所有”有效(bishop)移动,您可以通过了解所有对角线都通勤来更有效地枚举它们,因此从X到Y的有效移动意味着从Y到X的有效移动。主对角线上的有效bishop移动由
^B(a1 | b2 | c3 | d4 | e5 | f6 | g7 | h8)(a1 | b2 | c3 | d4 | e5 | f6 | h8)匹配$
,您将需要更多的技巧来消除主教从字段X移动到字段X的非移动:
^B(…)(?!\1)
。这很简单(但此注释太长)总而言之。@Gsk是真的,没错。这是真的。我意识到了这一点,我自己也像你一样做了。但我正在学习正则表达式,想学习它们是如何强大的。
(0 <= int(x) <= 8 if x.isdigit() else ord(x) -96 for x in move[1:5])