用正则表达式在扑克牌中找到"高牌"



扑克中的卡片排名如下:

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'

为什么错误:正则表达式

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)

也许,其他非正则表达式方法也值得研究,例如使用CounterOrderedDict:

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一样快,而且它也可以像regex一样优雅。

最新更新