日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python正则表达式(网址正则/超链接正则)

發布時間:2023/12/18 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python正则表达式(网址正则/超链接正则) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python正則表達式(匹配超鏈接URL)

? python的正則表達式是在re模塊,屬于內置模塊。正則表達式格式的詳細說明見文章結束表, 模式的構建通過PATTERN = re.compile(REGEX_STRING)構建,下面是python正則常用的函數。

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格式匹配
  • ? 從給定的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()
  • 從大量文本中提取指定格式的URL
  • ? 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與 js escape()/unecape
  • ? 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正则表达式(网址正则/超链接正则)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。