re正則匹配之findall


前言

re是python的一個正則匹配庫,可以使用正則表達式匹配出我們想要的內容

findall 使用

findall:返回字符串中所有不重疊匹配項的列表。
findall匹配的時候,會把結果放到list返回,如果沒有匹配到返回空list不會報錯

使用語法

findall(pattern, string, flags=0)
  • pattern 匹配的正則表達式
  • string 待匹配的字符串
  • flags=0 標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

示例一:三種寫法基礎示例

 

import re kk = re.compile(r'\d+')  # 匹配數字
res1 = kk.findall('one1two2three3four4') print(res1) # ['1', '2', '3', '4']

# 注意此處findall()的用法,可傳兩個參數;
kk = re.compile(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.com,歡迎使用!!!' res = re.findall(r'百度地址:.*?,歡迎使用!!!', a) print(res) # ['百度地址:www.baidu.com,歡迎使用!!!']

如果不加括號,它會把匹配的一整串全部取出來,如果只想要中間的那段內容,可以用(.*?)

import re # 取出url地址
a = '百度地址:www.baidu.com,歡迎使用!!!' res = re.findall(r'百度地址:(.*?),歡迎使用!!!', a) print(res) # ['www.baidu.com']

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM