在扑克牌的排名如下:

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)