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')]

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

  • 相关阅读:
    第八章 用通配符进行过滤
    第七章 数据过滤
    第六章 过滤数据
    第五章 排序和检索数据
    第四章 检索数据
    MySql 首记
    Effective C++ 6.继承与面向对象设计
    Effective C++ 5.实现
    ~~函数基础(五):内置函数~~
    ~~函数基础(四):递归函数~~
  • 原文地址:https://www.cnblogs.com/BeautifulSoup/p/8407656.html
Copyright © 2011-2022 走看看