Python正则表达式(网址正则/超链接正则)
Python正則表達式(匹配超鏈接URL)
? python的正則表達式是在re模塊,屬于內置模塊。正則表達式格式的詳細說明見文章結束表, 模式的構建通過PATTERN = re.compile(REGEX_STRING)構建,下面是python正則常用的函數。
| PATTERN = re.compile(REGEX_STRING) | 正則模式構建 |
| match_ret = re.match(PATTERN, str) | str是否符合某種模式,從str開始位置進行掃描 |
| match_ret = re.search(PATTERN, str) | str是否包含某種模式的字符串,掃描整個字符串 |
| match_ret.group(idx)/match_ret.groups() | 符合模式的所有字符串匹配(tartget_str) 上式match_ret無符合模式的匹配返回None,找到的符合模式的結果通過groups()取值 match_ret.group(idx=0)取指定位置的字符串匹配 match_ret.groups() 取所有字符串匹配 |
| re.findall(PATTERN/REGEX_STRING, str) | 返回所有符合模式的字符串列表 (ret_lst) |
? 從給定的URL中獲取IP(PORT),這個操作也可以通過python內置模塊urllib的request.Request(url=_url)構建(type://host, type://origin_req_host)獲取:
import reURL_M3U8 = 'https://www.kkarm.com:65/20190818/zzElGIgO/index.m3u8' URL_ORIGIN = "https://www.cmcm5.com/play/5334.html?5334-6-1" '''URL模式: http[s]://host:port/query目標: 獲取query前的base_url (schema://host:port)正則構建:方式1:字符串格式方式2:突出特征 -> 以query前的/為分隔 ''' # https://后的host:port(由字母數字下劃線, .點, :冒號組成, 遇到第一個/即終止匹配) HOST_PATTERN = re.compile(r"\w{4,5}://(\w|\.|:)+") # https://后的所有非/字符(遇到第一個/即終止) HOST_PATTERN2 = re.compile(r"(\w{4,5}://[^/]+)") host_match = re.match(HOST_PATTERN, URL_ORIGIN) host_match2 = re.match(HOST_PATTERN2, URL_M3U8) HOST = host_match and host_match.group() HOST2 = host_match2 and host_match.group()? re.findall()經常和python爬蟲結合,將網絡請求的文本內容進行提取(html/js),從中獲取指定格式的內容,從中提取URL在鉆入式的爬取其他鏈接內容。下面是部分格式化后的鏈接內容。
? 目標字符串1(格式化)[1]
%u7b2c2%u96c6$CNTY5MDI1Ng==# %u7b2c3%u96c6$CNTY5MDMwMA==# %u7b2c4%u96c6$CNTY5MDMwNA==$$$ 01$https://www.mgtv.com/b/159003/3363084.html# 02$https://www.mgtv.com/b/159003/3363085.html# 03$https://www.mgtv.com/b/159003/3364481.html# 04$https://www.mgtv.com/b/159003/3364483.html# 05$https://www.mgtv.com/b/159003/3366093.html$$$ %u7b2c01%u96c6$https://www.kkarm.com:65/20190818/zzElGIgO/index.m3u8# %u7b2c02%u96c6$https://www.kkarm.com:65/20190818/U90bZ2CW/index.m3u8$$$ %u7b2c1%u96c6$https://video.buycar5.cn/20201006/a15C23PF/index.m3u8# %u7b2c2%u96c6$https://video.buycar5.cn/20201006/UVsOhEq0/index.m3u8# %u7b2c3%u96c6$https://video.buycar5.cn/20201006/hzqZ3BgP/index.m3u8? 我們想要做的就是從中提取m3u8格式的URL(這是一種流式視頻的文件格式,列出了所有視頻片段的下載位置),下面是匹配思路:
js_content = """ %u7b2c2%u96c6$CNTY5MDI1Ng==#%u7b2c3%u96c6$CNTY5MDMwMA==#%u7b2c4%u96c6$CNTY5MDMwNA==$$$01$https://www.mgtv.com/b/159003/3363084.html#02$https://www.mgtv.com/b/159003/3363085.html#03$https://www.mgtv.com/b/159003/3364481.html#04$https://www.mgtv.com/b/159003/3364483.html#05$https://www.mgtv.com/b/159003/3366093.html$$$%u7b2c01%u96c6$https://www.kkarm.com:65/20190818/zzElGIgO/index.m3u8#%u7b2c02%u96c6$https://www.kkarm.com:65/20190818/U90bZ2CW/index.m3u8#$$$%u7b2c1%u96c6$https://video.buycar5.cn/20201006/a15C23PF/index.m3u8#%u7b2c2%u96c6$https://video.buycar5.cn/20201006/UVsOhEq0/index.m3u8#%u7b2c3%u96c6$https://video.buycar5.cn/20201006/hzqZ3BgP/index.m3u8 """-
按照[1]中的格式進行匹配
# 提取所有這個格式的內容 PATTERN = r"%u\w+\$(.*?)#{1}|\${3}" # 提取以m3u8結尾的鏈接 M3U8_PATTERN = PATTERN = r"%u\w+\$(.*?\.m3u8)#{1}|\${3}" m3u8_match0= re.findall(PATTERN, js_content) m3u8_match = re.findall(M3U8_PATTERN, js_content)(.*?)是re.findall()常用的匹配方式,()表示只提取括號中的內容,括號意外的作為格式匹配的一部分,比如從特定html內容里,提取需要的圖片鏈接:
img = re.findall('<div class="arc_body">\n<img src="(.*?)"', itext)[0]但是,這個提取的結果出現了偏差(m3u8結果)
CNTY5MDI1Ng==#%u7b2c3%u96c6$CNTY5MDMwMA==#%u7b2c4%u96c6$CNTY5MDMwNA==$$$01$https://www.mgtv.com/b/159003/3363084.html#02$https://www.mgtv.com/b/159003/3363085.html#03$https://www.mgtv.com/b/159003/3364481.html#04$https://www.mgtv.com/b/159003/3364483.html#05$https://www.mgtv.com/b/159003/3366093.html$$$%u7b2c01%u96c6$https://www.kkarm.com:65/20190818/zzElGIgO/index.m3u8 https://www.kkarm.com:65/20190818/U90bZ2CW/index.m3u8 '' https://video.buycar5.cn/20201006/a15C23PF/index.m3u8 https://video.buycar5.cn/20201006/UVsOhEq0/index.m3u8 -
只提取m3u8結尾的URL格式
文本[1]中,m3u8是一個鏈接格式,每個URL以“#”結尾,所有同類的URL以"$$$"結尾,URL都是以https開頭,遇到#或者$一個URL結束。正則的匹配實質是找到恰如其分的分割符,找到目標字符串。
M3U8_PATTERN = r"(https://[^#|$]*?\.m3u8)" m3u8_match = re.findall(M3U8_PATTERN, js_content)
? python 內置庫urllib.parse提供了quote()/unquote()函數來達到js escape()/unescape()的效果。對于爬取的內容含有js編碼過的字符串可以采用unquote函數進行解碼:
-
對中文進行解碼
js_content = js_content.replace('%u', '\\u').encode().decode('unicode_escape') -
還原js轉碼字符
import urllib.parse js_content = urllib.parse.unquote(js_content)
? 模式字符串使用特殊的語法來表示一個正則表達式,特殊字符代表本意,前面需要加上進行反斜杠\進行轉義。
? 表1 正則表達式模式(所有語言通用)
| ^ | 匹配字符串的開頭 |
| $ | 匹配字符串的末尾。 |
| . | 匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。 |
| […] | 用來表示一組字符,單獨列出:[amk] 匹配 ‘a’,‘m’或’k’ |
| [^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
| re* | 匹配0個或多個的表達式。 |
| re+ | 匹配1個或多個的表達式。 |
| re? | 匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式 |
| re{ n} | 精確匹配 n 個前面表達式。例如, o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的兩個 o。 |
| re{ n,} | 匹配 n 個前面表達式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。“o{1,}” 等價于 “o+”。“o{0,}” 則等價于 “o*”。 |
| re{ n, m} | 匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式 |
| a| b | 匹配a或b |
| (re) | 對正則表達式分組并記住匹配的文本 |
| \w | 匹配字母數字及下劃線 |
| \W | 匹配非字母數字及下劃線 |
| \s | 匹配任意空白字符,等價于 [ \t\n\r\f]。 |
| \S | 匹配任意非空字符 |
| \d | 匹配任意數字,等價于 [0-9]. |
| \D | 匹配任意非數字 |
| \A | 匹配字符串開始 |
| \Z | 匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。 |
| \z | 匹配字符串結束 |
| \G | 匹配最后匹配完成的位置。 |
| \b | 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
| \B | 匹配非單詞邊界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
| \n, \t, 等. | 匹配一個換行符。匹配一個制表符。等 |
| \1…\9 | 匹配第n個分組的內容。 |
| \10 | 匹配第n個分組的內容,如果它經匹配。否則指的是八進制字符碼的表達式。 |
總結
以上是生活随笔為你收集整理的Python正则表达式(网址正则/超链接正则)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oak深度相机入门教程-Full FOV
- 下一篇: websocket python爬虫_p