3.2.5.1 检查一手扑克牌

现在我们开始一个一个例子学习,把学习到的正则表达式进行综合使用。这个例子使用正则表达式来检查5张扑克牌是否有效,为了显示更好看,先写一个输出函数:

def displaymatch(match):

if match is None:

return print(None)

return print(‘<Match: %r, groups=%r>‘ % (match.group(), match.groups()))假定每一付牌要有5张组成,使用a表示王牌,k表示国王,q表示王后,j表示jack,t表示10,2-9表示相应的数字牌。下面的例子,就检查这付牌是否有效:

valid = re.compile(r"^[a2-9tjqk]{5}$")

displaymatch(valid.match("akt5q"))  # Valid

displaymatch(valid.match("akt5e"))  # Invalid.

displaymatch(valid.match("akt"))    # Invalid.

displaymatch(valid.match("727ak"))  # Valid.

结果输出如下:

检查一付扑克牌

<Match: ‘akt5q‘, groups=()>

None

None

<Match: ‘727ak‘, groups=()>

这个例子里,由于e不存在,导致不合法;akt只有3张,达不到5张所以也不合法。

正则表达式:r"^[a2-9tjqk]{5}$",其中^表示只从字符串开始进行匹配;[]表示匹配在中括号中任意的字符;a2-9tjqk表示字符集合,2-9表示2到9顺序所有数字;{5}表示至少匹配5个字符,才算成功;$表示词尾前匹配。

在最后这手牌727ak里,会有两个牌相同,那么怎么样才可以把有相同的牌找出来,如下:

pair = re.compile(r".*(.).*\1")

displaymatch(pair.match("717ak"))     # Pair of 7s.

displaymatch(pair.match("718ak"))     # No pairs.

displaymatch(pair.match("354aa"))     # Pair of aces.

结果输出如下:

<Match: ‘717‘, groups=(‘7‘,)>

None

<Match: ‘354aa‘, groups=(‘a‘,)>

在这个例子里,使用正则表达式r".*(.).*\1",点号表示任意字符;*表示任意重复;(.)是表示匹配一个字符作为一组;.*表示之间可以有任意字符;\1表示与前面分组相同的字符。如果想获取那一个字符重复,可以使用group来访问。

蔡军生  QQ:9073204 深圳

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 20:29:17

3.2.5.1 检查一手扑克牌的相关文章

【算法基础】插入排序

什么是插入排序? 插入排序的工作方式就像许多人排序一手扑克牌.开始的时候,我们的左手为空并且桌子上的牌面向下.然后我们每次从桌子上拿走一张牌并将它插入到左手中正确的位置.为了找到这张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,如下图所示.那在左手上的牌总是排好序的,原来这些牌都是桌子上牌堆中顶部的牌. 插入排序伪代码 对于插入排序,我们将其伪代码过程命名为INSERTION-SORT[A],其中的参数是一个数组A[1..n],包含长度为n的待排序的一个序列.下面为插入排序的不降序伪

算法导论_ch2

Ch2算法基础 2.1 插入排序 输入:n个数的一个序列〈a1,a2,…,an〉. 输出:输入序列的一个排列〈a′1,a′2,…,a′n〉,满足a′1≤a′2≤…≤a′n. 我们希望排序的数也称为关键词.插入排序,插入排序的工作方式像许多人排序一手扑克牌.开始时,我们的左手为空并且桌子上的牌面向下.然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置.为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,如下图所示.拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的

《排序算法系列3》插入排序

1 原理 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入 插入排序的工作方式非常像人们排序一手扑克牌一样.开始时,我们的左手为空并且桌子上的牌面朝下.然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置.为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,如下图所示: 2 思路 从第2个数开始,放到前面的数组中,形成一个有序数组 然后把第3个数放到前

Oracle SQL 调优健康检查脚本

Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性能问题的有力保证. 在CBO时代,一个SQL的执行计划是多样的.影响执行计划的因素也从过去RBO时代的SQL书写规则变为综合性因素.这为我们生成更加优秀执行计划提供了基础,同时也给我们进行调优带来的很多麻烦. 目前我们通常的做法,是通过AWR报告或者调试手段,发现某某SQL有问题,之后从Librar

程序模拟洗扑克牌(算法)

前一段时间找实习,腾讯面试中一轮面试官被问到这个题目,我回答了以下解法中的第一种,太搓了.直接遭面试官歧视了,回来搜了搜,发现一种更好的解法(以下解法中的另外一种).今天偶尔发现解法2事实上有毛病.于是改进了.有了算法3和算法4. 前提:一副扑克牌有54张.因此我们能够一个整型数组array[54]或者map来存储."A"用0~3,"2"用4~7,"3"用8~11......"K"用48~51,小鬼用52,大鬼用53表示.关于

洗扑克牌

理论: 洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1∼N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已. 解法: 初学者通常会直接想到,随机產生1∼N的乱数并将之存入阵列中,后来產生的乱数存入阵列前必须先检查阵列中是否已有重复的数字,如果有这个数就不存入,再重新產生下一个数,运气不好的话,重复的次数就会很多,程式的执行速度就很慢了,这不是一个好方法. 以1∼52的乱数排列為例好了,可以将阵列先依序由1到52填入,然后使用一个迴圈走访阵列,并随机產生1∼52的乱数,将產生

扑克牌游戏-华为OJ-C++实现

/*扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A.2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王): 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER. 请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR. 基本

OJ题目:扑克牌大小

题目描述: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A.2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER.请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR.基本

【题解】扑克牌游戏

[题解]扑克牌游戏 假如我们知道一个答案,那么我们剩下的问题就是去检查这个答案是否合法. 显然可以拿\(m\)做文章,假设我们最终可以得到\(ans\)组套牌,那么对于每张牌,如果它的数量比\(ans\)小,我们就需要拿\(joker\)补.多的就没关系了. 很棒的思路,还有一个贪心做法,也很神仙.orz #include<bits/stdc++.h> #define R register int #define gc getchar using namespace std; typedef