Python 网络爬虫笔记6 -- 正则表达式
生活随笔
收集整理的這篇文章主要介紹了
Python 网络爬虫笔记6 -- 正则表达式
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Python 網(wǎng)絡(luò)爬蟲筆記6 – 正則表達(dá)式
Python 網(wǎng)絡(luò)爬蟲系列筆記是筆者在學(xué)習(xí)嵩天老師的《Python網(wǎng)絡(luò)爬蟲與信息提取》課程及筆者實(shí)踐網(wǎng)絡(luò)爬蟲的筆記。
課程鏈接:Python網(wǎng)絡(luò)爬蟲與信息提取
參考文檔:
Requests 官方文檔(英文)
Requests 官方文檔(中文)
Beautiful Soup 官方文檔
re 官方文檔
Scrapy 官方文檔(英文)
Scrapy 官方文檔(中文)
一、正則表達(dá)式
1、介紹
正則表達(dá)式,又稱規(guī)則表達(dá)式(英語:Regular Expression,在代碼中常簡(jiǎn)寫為regex、regexp或RE)。正則表達(dá)式通常被用來檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。
2、基礎(chǔ)語法
| . | 表示任何單個(gè)字符 | |
| [ ] | 字符集,對(duì)單個(gè)字符給出取值范圍 | [abc]表示a、b、c,[a‐z]表示a到z單個(gè)字符 |
| [ ^ ] | 非字符集,對(duì)單個(gè)字符給出排除范圍 | [ ^abc]表示非a或b或c的單個(gè)字符 |
| * | 前一個(gè)字符0次或無限次擴(kuò)展 | abc* 表示ab、abc、abcc、abccc等 |
| + | 前一個(gè)字符1次或無限次擴(kuò)展 | abc+ 表示abc、abcc、abccc等 |
| ? | 前一個(gè)字符0次或1次擴(kuò)展 | abc? 表示ab、abc |
| | | 左右表達(dá)式任意一個(gè) | abc|def 表示abc、def |
| {m} | 擴(kuò)展前一個(gè)字符m次 | ab{2}c表示abbc |
| {m,n} | 擴(kuò)展前一個(gè)字符m至n次(含n) | ab{1,2}c表示abc、abbc |
| ^ | 匹配字符串開頭 | ^abc表示abc且在一個(gè)字符串的開頭 |
| $ | 匹配字符串結(jié)尾 | abc$表示abc且在一個(gè)字符串的結(jié)尾 |
| ( ) | 分組標(biāo)記,內(nèi)部只能使用| 操作符 | (abc)表示abc,(abc|def)表示abc、def |
| \d | 數(shù)字,等價(jià)于[0‐9] | |
| \D | 匹配一個(gè)非數(shù)字字符,等價(jià)于[ ^0-9] | |
| \w | 單詞字符,等價(jià)于[A‐Za‐z0‐9_] | |
| \W | 匹配任何非單詞字符,等價(jià)于“[ ^A-Za-z0-9_]”。 | |
| \f | 匹配一個(gè)換頁符,等價(jià)于\x0c和\cL。 | |
| \n | 匹配一個(gè)換行符,等價(jià)于\x0a和\cJ。 | |
| \r | 匹配一個(gè)回車符,等價(jià)于\x0d和\cM。 | |
| \s | 匹配任何不可見字符,包括空格、制表符、換頁符等等。等價(jià)于[ \f\n\r\t\v]。 | |
| \S | 匹配任何可見字符,等價(jià)于[^ \f\n\r\t\v]。 | |
| \t | 匹配一個(gè)制表符,等價(jià)于\x09和\cI。 | |
| \v | 匹配一個(gè)垂直制表符,等價(jià)于\x0b和\cK。 |
貪婪匹配與最小匹配: 默認(rèn)為貪婪匹配,加上?就可以實(shí)現(xiàn)最小匹配。
| *? | 前一個(gè)字符0次或無限次擴(kuò)展,最小匹配 |
| +? | 前一個(gè)字符1次或無限次擴(kuò)展,最小匹配 |
| ?? | 前一個(gè)字符0次或1次擴(kuò)展,最小匹配 |
| {m,n}? | 擴(kuò)展前一個(gè)字符m至n次(含n),最小匹配 |
3、經(jīng)典正則化表達(dá)式實(shí)例
# 由26個(gè)字母組成的字符串 ^[A‐Za‐z]+$# 由26個(gè)字母和數(shù)字組成的字符串 ^[A‐Za‐z0‐9]+$# 整數(shù)形式的字符串 ^‐?\d+$# 正整數(shù)形式的字符串 ^[0‐9]*[1‐9][0‐9]*$# 中國境內(nèi)郵政編碼,6位 [1‐9]\d{5}# 匹配中文字符 [\u4e00‐\u9fa5]# 國內(nèi)電話號(hào)碼,010‐68913536 \d{3}‐\d{8}|\d{4}‐\d{7}# IP地址字符串, 0‐99: [1‐9]?\d 100‐199: 1\d{2} 200‐249: 2[0‐4]\d 250‐255: 25[0‐5] (([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]).){3}([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5])二、re 庫
1、基礎(chǔ)
導(dǎo)入:
# python自帶re庫,不需要安裝 import reraw string 類型:
- raw string類型:原生字符串類型,不需要轉(zhuǎn)義字符來表示特殊字符
- re庫采用raw string類型表示正則表達(dá)式
2、re 庫函數(shù)
函數(shù)表: 函數(shù)在內(nèi)部會(huì)對(duì)正則表達(dá)式進(jìn)行編譯再匹配
| re.search(pattern, string, flags=0) | 在一個(gè)字符串中搜索匹配正則表達(dá)式的第一個(gè)位置,返回match對(duì)象 |
| re.match(pattern, string, flags=0) | 從一個(gè)字符串的開始位置起匹配正則表達(dá)式,返回match對(duì)象 |
| re.findall(pattern, string, flags=0) | 搜索字符串,以列表類型返回全部能匹配的子串 |
| re.split(pattern, string, maxsplit=0, flags=0) | 將一個(gè)字符串按照正則表達(dá)式匹配結(jié)果進(jìn)行分割,返回列表類型 |
| re.finditer(pattern, string, flags=0) | 搜索字符串,返回一個(gè)匹配結(jié)果的迭代類型,每個(gè)迭代元素是match對(duì)象 |
| re.sub(pattern, repl, string, count=0, flags=0) | 在一個(gè)字符串中替換所有匹配正則表達(dá)式的子串,返回替換后的字符串 |
參數(shù)
- pattern:正則表達(dá)式的字符串或原生字符串表示
- string:待匹配字符串
- flags:正則表達(dá)式使用時(shí)的控制標(biāo)記
- re.I re.IGNORECASE:忽略正則表達(dá)式的大小寫,[A‐Z]能夠匹配小寫字符
- re.M re.MULTILINE:正則表達(dá)式中的^操作符能夠?qū)⒔o定字符串的每行當(dāng)作匹配開始
- re.S re.DOTALL:正則表達(dá)式中的.操作符能夠匹配所有字符,默認(rèn)匹配除換行外的所有字符
- maxsplit:最大分割數(shù),剩余部分作為最后一個(gè)元素輸出
- repl:替換匹配字符串的字符串
- count:匹配的最大替換次數(shù)
返回: Match對(duì)象
| .string | 待匹配的文本 |
| .re | 匹配時(shí)使用的patter對(duì)象(正則表達(dá)式) |
| .pos | 正則表達(dá)式搜索文本的開始位置 |
| .endpos | 正則表達(dá)式搜索文本的結(jié)束位置 |
| .group(0) | 獲得匹配后的字符串 |
| .start() | 匹配字符串在原始字符串的開始位置 |
| .end() | 匹配字符串在原始字符串的結(jié)束位置 |
| .span() | 返回(.start(), .end()) |
示例:
import redef re_func():"""re 庫函數(shù)使用"""string = 'HIT123456 SZ666666'# search函數(shù)match1 = re.search(r'[1-9]\d{5}', string)if match1:# Match對(duì)象的屬性和方法print('-'*20)print(match1.group(0))print(match1.string)print(match1.re)print(match1.pos)print(match1.endpos)print(match1.start())print(match1.end())print(match1.span())print('-'*20)# match 函數(shù)match2 = re.match(r'[1-9]\d{5}', string)if match2:print(match2.group(0))# findall函數(shù)ls1 = re.findall(r'[1-9]\d{5}', string)print(ls1)# split函數(shù)ls2 = re.split(r'[1-9]\d{5}', string, maxsplit=1)print(ls2)# finditer函數(shù)for m in re.finditer(r'[1-9]\d{5}', string):if m:print(m.group(0))# sub函數(shù)res = re.sub(r'[1-9]\d{5}', 'number', string)print(res)if __name__ == '__main__':print('running regex')re_func()3、re.compile()
- 顯式編譯正則表達(dá)式,再匹配
- 可以使用re庫中的6種匹配函數(shù)
總結(jié)
以上是生活随笔為你收集整理的Python 网络爬虫笔记6 -- 正则表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 总数 进程_Linux运用一
- 下一篇: 无符号右移负数_关于负数的右移与无符号右