IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]3.2.5.1 检查一手扑克牌

    caimouse发表于 2015-08-29 08:36:19
    love 0

    现在我们开始一个一个例子学习,把学习到的正则表达式进行综合使用。这个例子使用正则表达式来检查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 深圳



沪ICP备19023445号-2号
友情链接