扑克牌的排名如下:
A>K>Q>J>T>9>8>7>6>5>4>3>2 # Ace, King, Queen, Jack, Ten, 9, ...
目前,我必须找到手中的“高卡”如下:
>>> re.search('.*(A|K|Q|J|T|9|8|7|6|5|4|3|2)','2Q3AK').group(1)
'K'
这样做可以不经过这么多的改动吗?我试着把9-2写成[9-2]
,但似乎字符类需要优先排序,在这种情况下,它无法正确地检测到高卡。对于上述示例,正确的/最佳的正则表达式是什么?
注:上面的例子是错误的--正确的答案应该是"A“而不是"K”。下面是一个更新的尝试:
>>> re.search('.*(A)|.*(K)|.*(Q)|.*(J)|.*(T)|.*(9)|.*(8)|.*(7)|.*(6)|.*(5)|.*(4)|.*(3)|.*(2)', '2Q3AK').group(1)
'A'
发布于 2019-11-11 23:22:51
为什么这是错误的:判罚
re.search('.*(A|K|Q|J|T|9|8|7|6|5|4|3|2)','2Q3AK').group(1)
'K'
是贪婪的匹配。它为.*
匹配尽可能多的字符,然后显示出最后一个字符:
re.search('.*(A|Q|J|T|9|8|7|6|5|4|3|2|K)','KQ3A2').group(1)
'2'
作为一个框架挑战,是否有特殊的原因需要为此使用re
?似乎它会更明确,也许更容易理解,只需要搜索最高顺序的字符:
order = 'AKQJT98765432'
hand = '2Q3AK'
highest = min(hand, key=order.index)
发布于 2019-11-11 23:24:19
也许,其他非正则表达式方法也值得研究,例如使用Counter
或OrderedDict
。
from collections import Counter, OrderedDict
l = ['A', 'K', 'Q', 'J', 'T', 9, 8, 7, 6, 5, 4, 3, 2]
string = '2Q3AK'
c = Counter(string)
for i in l:
if i in c:
print(i)
break
输出
A
它的速度和regex一样快,如果这是一个问题的话,它也可以是优雅的。
https://stackoverflow.com/questions/58809816
复制相似问题