zoukankan      html  css  js  c++  java
  • Python瓦匠 —— 正则表达式(三)

    贪心和非贪心匹配

    Python正则表达式默认是贪心的,在有二异的情况下,他们会尽可能的匹配最长的字符串。

    所以当我们使用(Ha){3,5}匹配'HaHaHaHaHa'的时候回匹配到'HaHaHaHaHa'。

    而{}?既是非贪心版本,它会尽可能的匹配最短的字符串。

    例如:

    import re
    
    greedyHaRegex = re.compile(r'(Ha){3,5}')
    mo = greedyHaRegex.search('HaHaHaHaHa')
    print(mo.group())
    
    greedyHaRegex = re.compile(r'(Ha){3,5}?')#非贪心匹配
    mo1 = greedyHaRegex.search('HaHaHaHaHa')
    print(mo1.group())

    运行结果:

    HaHaHaHaHa
    HaHaHa
    >>> 

    注意:?问号在正则表达式中可能有两种意思:声明非贪心匹配或者表示可选分组,这两种含义完全无关。

    二 findall()方法

    除了search()方法外,Regex对象也有一个findall()方法。

    search()返回一个Match对象,包含被查找字符串中的‘第一次’匹配文本。

    findall()方法将返回一组字符串,包含被查找文本中所有匹配。

    例子:

    >>> phoneNum = re.compile(r'ddd-ddd-dddd')
    >>> phoneNum.findall('Cell:400-820-8820 Work:400-820-8821')
    ['400-820-8820', '400-820-8821']

    findall()返回的不是一个Match对象,而是返回一个字符串列表,只要在正则表达式中没有分组。

    如果在正则表达式中进行了分组,那么findall()将返回元组的列表。每个元组表示一个找到的匹配,其中的项就是正则表达式中每个分组的匹配字符串。

    例如:(请注意,被编译的正则表达式有分组)

    >>> phoneNum = re.compile(r'(ddd)-(ddd)-(dddd)')
    >>> phoneNum.findall('Cell:400-820-8820 Work:400-820-8821')
    [('400', '820', '8820'), ('400', '820', '8821')]

    记住分组和不分组的区别。

  • 相关阅读:
    【CSS】CSS 页面布局:盒子模型(内容区、边框、内边距、外边距)
    压缩/解压文件
    WebApiClient.JIT
    并行+异步执行操作
    JSON输出时不输出某些属性值
    ASP.NET MVC中Filter过滤器的使用
    使用git克隆github上的项目失败,报错error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
    C# 实现WebSocket通信
    写日志
    list随机生成数值
  • 原文地址:https://www.cnblogs.com/BeautifulSoup/p/8407656.html
Copyright © 2011-2022 走看看