美文网首页
re模块中search, findall, match等区别与用

re模块中search, findall, match等区别与用

作者: 5cb608806559 | 来源:发表于2020-11-04 00:25 被阅读0次

    一、匹配对象以及group()和groups()方法:

    当处理正则表达式时,除了正则表达式对象之外,还有另一个对象类型:匹配对象。这些是成功调用match()或者search()返回的对象。匹配对象有两个主要的方法:group()和groups()

    1. group()要么返回整个匹配对象,要么根据要求返回特定子组。

    >>> a = re.search(r"(\w)(.\d)","as.21")
    >>> a<_sre.SRE_Match object; span=(1, 4), match='s.2'>
    >>> a.group()  #返回整个匹配对象's.2'
    >>> a.group(0)
    's.2'
    >>> a.group(1) #根据要求返回特定子组
    's'
    >>> a.group(2)
    '.2'
    

    2. groups()仅返回一个包含唯一或者全部子组的元组。

    >>> a.groups()
    ('s', '.2')  #返回全部子组,是包含在一个元组中的
    

    3. 如果没有子组的要求,那么当group()仍然返回整个匹配时,groups()返回一个空元组。

    >>> a = re.search(r"\d+","334354") #没有子组匹配
    >>> a.group() #返回整个匹配
    '334354'
    >>> a.groups() #返回空元组
    ()
    

    好了,复习完上面这些概念,我们就重点来看下re模块中最常用的re.search()re.findall()的区别。


    对比完区别之后,我们下面来通过一些示例来理解re.search()re.findall()在用法上的异同,以及更多扩展re.match、re.fullmatch 、re.finditer、re.sub和re.subn的用法示意。

    二、re.search(pattern, string, flags=0)

    搜索整个字符串并返回第一个成功的匹配,成功则返回一个匹配对象,失败则返回None.

    >>> re.search("com","www.baidu.com")
    <_sre.SRE_Match object; span=(10, 13), match='com'> 
    
    >>> re.search("com","www.baidu.com.com.com")
    <_sre.SRE_Match object; span=(10, 13), match='com'> # 只返回第一个匹配的位置
    

    三、re.findall(pattern, string, flags=0)

    在字符串中找到正则表达式所匹配的所有子串,并返回一个列表。如果没有找到匹配,则返回空列表。

    >>> re.findall("com","www.baidu.com.com.com")
    ['com', 'com', 'com']
    
    >>> re.findall("aa","www.baidu.com.com.com")
    []
    

    四、re.match(pattern,string,flags=0)

    • match()试图从字符串的起始部分对模式进行匹配,如果成功则返回一个匹配对象,失败则返回None.
    >>> import re
    >>> re.match(r"www","www.baidu.com")
    <_sre.SRE_Match object; span=(0, 3), match='www'> # 返回的是匹配对象 
    
    >>> type(re.match("www","www.baidu.com")) # 查看返回类型
    <class '_sre.SRE_Match'> 
    
    >>> print(re.match("com","www.baidu.com"))
    None
    

    五、 re.fullmatch(pattern, string, flags=0)

    完全匹配string

    >>> print(re.fullmatch("com","com"))
    <_sre.SRE_Match object; span=(0, 3), match='com'> 
    
    >>> print(re.fullmatch("com","comssa"))  #必须要完全匹配
    None
    

    六、 re.finditer(pattern,string,flags=0)

    查找所有匹配成功的字符串,并返回iteror

    >>> re.finditer("com","www.baidu.com.com.com") #返回迭代器对象
    <callable_iterator object at 0x00000247617F06D8> 
    
    >>> list(re.finditer("com","www.baidu.com.com.com"))
    [<_sre.SRE_Match object; span=(10, 13), match='com'>, <_sre.SRE_Match object; span=(14, 17), match='com'>, <_sre.SRE_Match object; span=(18, 21), match='com'>]
    

    七、re.sub()和re.subn()

    • re.sub用于替换字符串中的匹配项,
    • pattern : 正则中的模式字符串。
    • repl : 替换的字符串,也可为一个函数。
    • string : 要被查找替换的原始字符串。
    • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
    >>> re.sub(r"[ae]","?","adsdeef")
    '?dsd??f'
    >>> re.subn(r"[ae]","?","adsdeef")  # subn()比sub()多返回了一个替换的总数
    ('?dsd??f', 3)
    

    相关文章

      网友评论

          本文标题:re模块中search, findall, match等区别与用

          本文链接:https://www.haomeiwen.com/subject/ekdwvktx.html