正则匹配方法之findall
核心要点: findall()是将所有匹配到的字符,以列表的形式返回。
如果未匹配,则返回空列表。
一、()方法
语法: findall(string=None, pos=0, endpos=9223372036854775807, *, source=None)
函数作用:
在string[pos,endpos]区间从pos下标开始查找所有满足pattern的子串,直到endpos位置结束,并以列表的形式返回查找的结果,如果未找到则返回一个空列表。
参数说明:
**string:**被匹配的字符串
pos: 匹配的起始位置,可选,默认为0
endpos: 匹配的结束位置,可选,默认为len(string)。也就是说如果不指定pos和endpos的话,该方法会在整个字符串中查找满足条件的子串。
import re
# 1、正则表达式中无分组
# 查找到正则表达式匹配的前10个字符中的所有数字
pattern=(r'\d+')
match=('o89ne1two2three3four4',0,10)
print (match) #返回['89','1','2']
# 2、正则表达式中有1个分组
#查找字符串中所有的数字子串
import re
aa='erd12343.jl34d545fd789'
pattern=(r'.*?(\d+).*?')
result=(aa)
print (result) # 返回 ['12343', '34', '545', '789']
# 3、正则表达式中有多个分组
# 提取字符串中所有域名地址
import re
add = '//action=?asdfsd and other //a=b'
pattern=(r'((w{3}\.)(\w+\.)+(com|edu|cn|net))')
result = (add)
print (result) #返回 [('', 'www.', 'com.', 'edu'), ('', 'www.', 'baidu.', 'com')]
总结如下:
A、无分组时,将所有匹配到的字符,以列表的形式返回
B、正则表达式中只有1个分组(即圆括号)时,返回的列表元素由所有成功匹配表达式中分组内容组成。
C、当正则表达式中含有多个分组时,返回列表中的元素由所有满足匹配的内容组成,但是每个元素都是由表达式中分组内容组成的元组。
二、()方法
语法: findall(pattern, string, flags=0)
函数作用: 获取字符串中所有能匹配的字符串,并以列表的形式返回。
参数说明:
pattern: 匹配的正则表达式
string: 被匹配的字符串
flags: 标志位,用于控制正则表达式的匹配方式,如是否区分大小写,是否匹配多行等
与()的区别:
不能指定匹配的区间pos和endpos
# 这里只举一个简单的例子,其他的与()原理一样
import re
res = (r'\w+', 'I am a boy!')
print (res) # 返回 ['I', 'am', 'a', 'boy']