首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用正则表达式在扑克牌中找到“高牌”

用正则表达式在扑克牌中找到“高牌”
EN

Stack Overflow用户
提问于 2019-11-11 23:06:58
回答 2查看 125关注 0票数 0

扑克牌的排名如下:

代码语言:javascript
运行
复制
A>K>Q>J>T>9>8>7>6>5>4>3>2 # Ace, King, Queen, Jack, Ten, 9, ...

目前,我必须找到手中的“高卡”如下:

代码语言:javascript
运行
复制
>>> 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”。下面是一个更新的尝试:

代码语言:javascript
运行
复制
>>> re.search('.*(A)|.*(K)|.*(Q)|.*(J)|.*(T)|.*(9)|.*(8)|.*(7)|.*(6)|.*(5)|.*(4)|.*(3)|.*(2)', '2Q3AK').group(1)
'A'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-11 23:22:51

为什么这是错误的:判罚

代码语言:javascript
运行
复制
re.search('.*(A|K|Q|J|T|9|8|7|6|5|4|3|2)','2Q3AK').group(1)
'K'

是贪婪的匹配。它为.*匹配尽可能多的字符,然后显示出最后一个字符:

代码语言:javascript
运行
复制
re.search('.*(A|Q|J|T|9|8|7|6|5|4|3|2|K)','KQ3A2').group(1)
'2'

作为一个框架挑战,是否有特殊的原因需要为此使用re?似乎它会更明确,也许更容易理解,只需要搜索最高顺序的字符:

代码语言:javascript
运行
复制
order = 'AKQJT98765432'
hand = '2Q3AK'
highest = min(hand, key=order.index)
票数 1
EN

Stack Overflow用户

发布于 2019-11-11 23:24:19

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

代码语言:javascript
运行
复制
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

输出

代码语言:javascript
运行
复制
A

它的速度和regex一样快,如果这是一个问题的话,它也可以是优雅的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58809816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档