re正则匹配之findall
前⾔
re是python的⼀个正则匹配库,可以使⽤正则表达式匹配出我们想要的内容
findall 使⽤
findall:返回字符串中所有不重叠匹配项的列表。
findall匹配的时候,会把结果放到list返回,如果没有匹配到返回空list不会报错
使⽤语法
findall(pattern, string, flags=0)
pattern 匹配的正则表达式
string 待匹配的字符串
flags=0 标志位,⽤于控制正则表达式的匹配⽅式,如:是否区分⼤⼩写,多⾏匹配等等。⽰例⼀:三种写法基础⽰例
import re
kk = repile(r'\d+') # 匹配数字
res1 = kk.findall('one1two2three3four4')
print(res1)
# ['1', '2', '3', '4']
# 注意此处findall()的⽤法,可传两个参数;
kk = repile(r'\d+')
res2 = re.findall(kk,"one123two2")
print(res2)
# ['123', '2']
# 也可以直接在findall传2个参数
res3 = re.findall(r'\d+', "one123two2")
print(res3)
# ['123', '2']
⽰例⼆:
匹配多个满⾜条件的结果,出字符串中有多少个ab, 两个字符挨着的
import re
a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# 1.出字符串中有多少个ab, 两个字符挨着
res1 = re.findall(r"ab", a)
print(res1)
# ['ab', 'ab', 'ab', 'ab', 'ab']
继续查如ab, aab, aaab,aaaab这种,a可以重复,也就是匹配前⾯的a是1个或多个
+是代表前⾯的字符出现1次或多次
import re
a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# 2.+是代表前⾯的字符出现1次或多次
res1 = re.findall(r"a+b", a)
print(res1)
# ['ab', 'aab', 'ab', 'ab', 'aaab']
*是代表匹配前⾯的字符出现0次或多次
正则匹配多个条件import re
a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# *代表前⾯的字符出现0次或多次
res1 = re.findall(r"a*b", a)
print(res1)
# ['ab', 'aab', 'ab', 'b', 'b', 'ab', 'b', 'b', 'aaab', 'b', 'b']
要匹配a和b之间有⼀个字符的,⽐如aab,abb,acb,adb都符合
.就是匹配除 \n (换⾏符)以外的任意⼀个字符
import re
a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# .就是匹配除 \n (换⾏符)以外的任意⼀个字符
res1 = re.findall(r"a.b", a)
print(res1)
# ['aab', 'abb', 'abb', 'aab']
贪婪与⾮贪婪
接着继续查a和b之间,可以有字符如axb,axxxb,axxxxb ,其中x是任意字符,x也可以没有字符如ab。但中间不能包含b,遇到b⽴马结束,如abcaab这种不符合,遇到第⼀个b就结束匹配
符号.* 贪婪,匹配从.*前⾯为开始到后⾯为结束的所有内容
import re
a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# 符号.* 贪婪,匹配从.*前⾯为开始到后⾯为结束的所有内容
res1 = re.findall(r"a.*b", a)
print(res1)
# ['abcaabffabbcdaccbfabbbgggaaabbb']
符号.*? ⾮贪婪,遇到开始和结束就进⾏截取,因此截取多次符合的结果,中间没有字符也会被截取
import re
a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# 符号.*? ⾮贪婪,遇到开始和结束就进⾏截取
res1 = re.findall(r"a.*?b", a)
print(res1)
# ['ab', 'aab', 'ab', 'accb', 'ab', 'aaab']
()的使⽤
⽐如我要从下⾯这段⽂本中取出百度地址, 上⾯学到的.*?是⾮贪婪匹配,可以匹配出我们想要的内容
import re
# 取出url地址
a = '百度地址:www.baidu,欢迎使⽤'
res = re.findall(r'百度地址:.*?,欢迎使⽤', a)
print(res)
# ['百度地址:www.baidu,欢迎使⽤']
如果不加括号,它会把匹配的⼀整串全部取出来,如果只想要中间的那段内容,可以⽤(.*?) import re
# 取出url地址
a = '百度地址:www.baidu,欢迎使⽤'
res = re.findall(r'百度地址:(.*?),欢迎使⽤', a)
print(res)
# ['www.baidu']
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论