在扑克牌的排名如下:
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]
,但似乎字符类需要进行递增排序,在这种情况下,将无法正确检测高卡。什么是对上面的例子中proper/best正则表达式?
注:上面的例子是错误的--正确的答案应该是"A"而不是"K"。这里有一个更新的尝试:
>>> re.search('.*(A)|.*(K)|.*(Q)|.*(J)|.*(T)|.*(9)|.*(8)|.*(7)|.*(6)|.*(5)|.*(4)|.*(3)|.*(2)', '2Q3AK').group(1)
'A'
分析解答
为什么这是错的:正则表达式
re.search('.*(A|K|Q|J|T|9|8|7|6|5|4|3|2)','2Q3AK').group(1)
'K'
为greedy-matching。它尽可能多的字符相匹配.*
,因为它可以,然后吐出最后一个字符:
re.search('.*(A|Q|J|T|9|8|7|6|5|4|3|2|K)','KQ3A2').group(1)
'2'
作为一个框架的挑战,有没有你需要使用re
这个特殊的原因?似乎将更加明确,可能更容易理解,只是搜索highest-ordered字符:
order = 'AKQJT98765432'
hand = '2Q3AK'
highest = min(hand, key=order.index)