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

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

  • 相关阅读:
    函数基础
    全局变量与类似配置文件的模块文件
    global语句(python学习手册422页)
    作用域实例
    变量名解析:LEGB原则
    作用域
    第三方库安装方法
    s[-1]和s[len(s)-1]
    查找特定后缀的文件
    logging日志管理-将日志写入文件
  • 原文地址:https://www.cnblogs.com/BeautifulSoup/p/8407656.html
Copyright © 2011-2022 走看看