<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
re.findall()
在字串中找到正規表示式所匹配的所有子串,並返回一個列表;如果沒有找到匹配的,則返回空列表。返回結果是列表型別,需要遍歷一下才能依次獲取每組內容。
findall(patern, string, flags=0)
pattern
: 正則中的模式字串。string
: 要被查詢替換的原始字串。flags
: 標誌位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等。import re content = 'Hello 123456789 Word_This is just a test 666 Test' results = re.findall('d+', content) print(results) for result in results: print(result)
結果:
['123456789', '666']
123456789
666
Process finished with exit code 0
注意利用re.findall()函數沒有group()和groups(),因為其返回結果是一個列表。
re.compile()
方法可以將正則字串編譯成正規表示式物件,以便在後面的匹配中複用。re.compile(pattern[, flags])
re.compile()中可以傳入忽略換行等匹配模式,這樣在search()、findall()方法中就不需要額外傳入了。
因此,re.findall()方法有2種表達方式:
import re content = 'one1two22three333four4444' pattern = re.compile(r'd+') print('===方法1:===') result1 = re.findall(pattern, content) print(result1) print('===方法2===') result2 = pattern.findall(content) print(result2)
結果:
===方法1:===
['1', '22', '333', '4444']
===方法2===
['1', '22', '333', '4444']
Process finished with exit code 0
注意正規表示式中括號()的使用
(1)正規表示式中當沒有括號時,正常匹配:
import re str1 = '2345 3456 4567 5678 6789' pattern_1 = re.compile('w+s+w+') # w 表示匹配包括下劃線的任何單詞字元,等價於[A-Za-z0-9_] print(pattern_1.findall(str1))
結果:
['2345 3456', '4567 5678']
Process finished with exit code 0
(2)正規表示式中有一個括號時,其輸出的內容就是括號匹配到的內容,而不是整個表示式所匹配到的結果:
import re str1 = '2345 3456 4567 5678 6789' pattern_1 = re.compile('(w+)s+w+') # w 表示匹配包括下劃線的任何單詞字元,等價於[A-Za-z0-9_] print(pattern_1.findall(str1))
結果:
['2345', '4567']
Process finished with exit code 0
整個正規表示式執行了,只不過只輸出括號匹配到的內容,即輸出的是第一個 (w+) 匹配到的內容:
在第一次匹配時跟上述沒有括號時一樣,匹配到"2345 3456",只不過只輸出(/w+)匹配到的結果 即"2345";
第二次匹配同理,從"4567" 開始,匹配到"4567 5678",但是還是隻是輸出(/w+)匹配到的結果 即"4567"。
(3)當正規表示式中有兩個括號時,其輸出是一個list 中包含2個 tuple:
import re str1 = '2345 3456 4567 5678 6789' pattern_1 = re.compile('((w+)s+w+)') # w 表示匹配包括下劃線的任何單詞字元,等價於[A-Za-z0-9_] print(pattern_1.findall(str1))
結果:
[('2345 3456', '2345'), ('4567 5678', '4567')]
Process finished with exit code 0
從輸出的結果可以看出,結果中包含兩個元組,每一個元組中有兩個字串。
第一個元組是第一次匹配的結果,其中的第一個字串 "2345 3456" 是正規表示式最外面的括號
((w+)s+w+)
匹配輸出的結果;
第一個元組中的第二個字串 "2345"是正規表示式裡面括號
(w+)
匹配輸出的結果 ;
第二個元組是第二次匹配的結果,匹配原理與第一次匹配相同。
在寫正規表示式的時候總會遇到不少的問題, 特別是在表示式有多個元組的時候。下面看下re模組下的findall()函數和多個表示式元組相遇的時候會出現什麼樣的坑。
程式碼如下:
import re str="a b c d" regex0=re.compile("((w )s w )") print(regex0.findall(str)) regex1=re.compile("(w )s w ") print(regex1.findall(str)) regex2=re.compile("w s w ") print(regex2.findall(str))
結果:
[('a b', 'a'), ('c d', 'c')]
['a', 'c']
['a b', 'c d']
可能結果有點意外,下面解釋一下
結論:findall()返回的是括號所匹配到的結果(如regex1),多個括號就會返回多個括號分別匹配到的結果(如regex),如果沒有括號就返回就返回整條語句所匹配到的結果(如regex2)。所以在提取資料的時候就需要注意這個坑。
實際上是由其並不是python特有的,這是 正則 所特有的 , 任何一門高階語言使用正則都滿足這個特點:有括號時只能匹配到括號中的內容,沒有括號【相當於在最外層增加了一個括號】。在正則裡面 “()” 代表的是分組的意思,一個括號代表一個分組,你只能匹配到"()"中的內容
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45