一、匹配对象以及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")) # 查看返回类型
>>> 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") #返回迭代器对象
>>> 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)