校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 正則表達式re.sub替換不完整的問題及完整解決方案

正則表達式re.sub替換不完整的問題及完整解決方案

熱門標簽:梅縣地圖標注 呼叫系統外呼只能兩次 甘肅醫療外呼系統排名 西藏智能外呼系統代理商 外呼系統無呼出路由是什么原因 地圖標注教學點 ai電話機器人搭建 400電話辦理電話辦理 貴港公司如何申請400電話

title: 正則表達式re.sub替換不完整的問題現象及其根本原因

toc: true
comment: true
date: 2018-08-27 21:48:22
tags: ["Python", "正則表達式"]
category: ["Python"]
---

問題描述

問題的起因來自于一段正則替換。為了從一段HTML代碼里面提取出正文,去掉所有的HTML標簽和屬性,可以寫一個Python函數:

import re
def remove_tag(html):
 text = re.sub('.*?>', '', html, re.S)
 return text

這段代碼的使用了正則表達式的替換功能re.sub。這個函數的第一個參數表示需要被替換的內容的正則表達式,由于HTML標簽都是使用尖括號包起來的,因此使用.*?>就可以匹配所有xxx yyy="zzz">/xxx>

第二個參數表示被匹配到的內容將要被替換成什么內容。由于我需要提取正文,那么只要把所有HTML標簽都替換為空字符串即可。第三個參數就是需要被替換的文本,在這個例子中是HTML源代碼段。

至于re.S,在4年前的一篇文章中我講到了它的用法:https://www.jb51.net/article/146384.htm

現在使用一段HTML代碼來測試一下:

import re
def remove_tag(html):
 text = re.sub('.*?>', '', html, re.S)
 return text
source_1 = '''
div class="content">今天的主角是a href="xxx">kingname/a>,我們掌聲歡迎!/div>
'''
text = remove_tag(source_1)
print(text)

運行效果如下圖所示,功能完全符合預期

再來測試一下代碼中有換行符的情況:

import re
def remove_tag(html):
 text = re.sub('.*?>', '', html, re.S)
 return text
source_2 = '''
div class="content">
 今天的主角是
 a href="xxx">kingname/a>
 ,我們掌聲歡迎!
/div>
'''
text = remove_tag(source_2)
print(text)

運行效果如下圖所示,完全符合預期。


經過測試,在絕大多數情況下,能夠從的HTML代碼段中提取出正文。但也有例外。

例外情況

有一段HTML代碼段比較長,內容如下:

img>
/span>span>遇見kingname/span>/a >a >span class='url-icon'> img '>/span>span >溫柔/span>/a >a >span >#青南#/span>/a > br />就在這里…br />我的小侯爺呢???

運行效果如下圖所示,最后兩個HTML標簽替換失敗。

一開始我以為是HTML里面的空格或者引號引起的問題,于是我把HTML代碼進行簡化:

img>/span>span>遇見kingname/span>/a>a>span>img>/span>span>溫柔/span>/a>a>span>#青南#/span>/a>br/>就在這里…br/>我的小侯爺呢

問題依然存在,如下圖所示。

而且更令人驚訝的是,如果把第一個標簽img>刪了,那么替換結果里面就少了一個標簽,如下圖所示。

實際上,不僅僅是刪除第一個標簽,前面任意一個標簽刪了都可以減少結果里面的一個標簽。如果刪除前面兩個或以上標簽,那么結果就正常了。

答疑解惑

這個看起來很奇怪的問題,根本原因在re.sub的第4個參數。從函數原型可以看到:

def sub(pattern, repl, string, count=0, flags=0)

第四個參數是count表示替換個數,re.S如果要用,應該作為第五個參數。所以如果把remove_tag函數做一些修改,那么結果就正確了:

def remove_tag(html):
 text = re.sub('.*?>', '', html, flags=re.S)
 return text

那么問題來了,把re.S放在count的位置,為什么代碼沒有報錯?難道re.S是數字?實際上,如果打印一下就會發現,re.S確實可以作為數字:

>>> import re
>>> print(int(re.S))
16

現在回頭數一數出問題的HTML代碼,發現最后多出來的兩個br>標簽,剛剛好是第17和18個標簽,而由于count填寫的re.S可以當做16來處理,那么Python就會把前16個標簽替換為空字符串,從而留下最后兩個。

至此問題的原因搞清楚了。

這個問題沒有被及早發現,有以下幾個原因:

被替換的HTML代碼是代碼段,大多數情況下HTML標簽不足16個,所以問題被隱藏。re.S是一個對象,但也是數字,count接收的參數剛好也是數字。在很多編程語言里面,常量都會使用數字,然后用一個有意義的大寫字母來表示。re.S 處理的情況是div \n> 而不是div>\n/div>但測試的代碼段標簽都是第二種情況,所以在代碼段里面實際上加不加re.S效果是一樣的。

補充:下面在給大家介紹下正則表達式 re.sub()替換功能

re.sub()替換功能

re.sub是個正則表達式方面的函數,用來實現通過正則表達式,實現比普通字符串的replace更加強大的替換功能。簡單的替換功能可以使用replace()實現。

def main():
 text = '123, word!'
 text1 = text.replace('123', 'Hello')
 print(text1)
if __name__ == '__main__':
 main()
# Hello, wold!

如果通過re.sub(0函數則可以匹配任意的數字,并將其替換:

import re
def main():
 content = 'abc124hello46goodbye67shit'
 list1 = re.findall(r'\d+', content)
 print(list1)
 mylist = list(map(int, list1))
 print(mylist)
 print(sum(mylist))
 print(re.sub(r'\d+[hg]', 'foo1', content))
 print()
 print(re.sub(r'\d+', '456654', content))
if __name__ == '__main__':
 main()
# ['124', '46', '67']
# [124, 46, 67]
# 237
# abcfoo1ellofoo1oodbye67shit
# abc456654hello456654goodbye456654shit

總結

以上所述是小編給大家介紹的正則表達式re.sub替換不完整的問題及完整解決方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

您可能感興趣的文章:
  • python 正則表達式 re.sub & re.subn
  • Python使用正則表達式獲取網頁中所需要的信息
  • Python正則表達式中的re.S的作用詳解

標簽:泰安 湖州 海口 大興安嶺 涼山 哈密 本溪 常州

巨人網絡通訊聲明:本文標題《正則表達式re.sub替換不完整的問題及完整解決方案》,本文關鍵詞  正則,表達式,re.sub,替換,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《正則表達式re.sub替換不完整的問題及完整解決方案》相關的同類信息!
  • 本頁收集關于正則表達式re.sub替換不完整的問題及完整解決方案的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日本免费新一区视频| 欧美日韩国产小视频在线观看| 91热门视频在线观看| 99re在线精品| 久久网站最新地址| 午夜精品一区二区三区免费视频 | 黄一区二区三区| 色域天天综合网| 国产欧美一区二区三区在线老狼| 亚洲国产一区视频| 成人不卡免费av| 久久亚洲欧美国产精品乐播| 日本中文字幕一区| 丁香婷婷综合网| 亚洲女人****多毛耸耸8| 91在线精品一区二区| 国产99久久久国产精品潘金网站| 国产精品一二三区| 777xxx欧美| 亚洲综合视频网| 色哟哟日韩精品| 1区2区3区精品视频| 成人av在线网站| 国产精品美女久久久久久 | 国产日韩欧美麻豆| 久久av老司机精品网站导航| 欧美探花视频资源| 亚洲精品国产品国语在线app| 国产91精品入口| 国产日韩欧美精品在线| 国产揄拍国内精品对白| 欧美mv和日韩mv的网站| 69堂成人精品免费视频| 成人av电影免费观看| 久久爱另类一区二区小说| 国产最新精品精品你懂的| 欧美mv和日韩mv的网站| 精品亚洲免费视频| 欧美成人一级视频| 久久国产婷婷国产香蕉| 欧美白人最猛性xxxxx69交| 麻豆精品久久久| 日韩视频在线你懂得| 麻豆91在线播放| 久久噜噜亚洲综合| 成人午夜电影久久影院| 亚洲视频在线一区观看| 色域天天综合网| 日日欢夜夜爽一区| 精品国产亚洲在线| 国产不卡视频一区| 亚洲最大色网站| 日韩免费观看2025年上映的电影| 美国毛片一区二区三区| 亚洲国产成人自拍| 色呦呦国产精品| 青青草原综合久久大伊人精品优势| 欧美xxx久久| 本田岬高潮一区二区三区| 一区二区三区四区在线播放| 在线不卡欧美精品一区二区三区| 亚洲电影在线播放| 制服丝袜中文字幕亚洲| 国产伦理精品不卡| 曰韩精品一区二区| 日韩欧美一区中文| 99在线精品视频| 亚洲丰满少妇videoshd| 久久久精品中文字幕麻豆发布| av亚洲精华国产精华| 日韩制服丝袜先锋影音| 国产欧美日韩激情| 欧美人狂配大交3d怪物一区| 国内精品久久久久影院薰衣草| 1024成人网| 日韩免费性生活视频播放| 91老师国产黑色丝袜在线| 男女性色大片免费观看一区二区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 精品欧美乱码久久久久久 | 欧美精品视频www在线观看| 国产一区二区在线视频| 亚欧色一区w666天堂| 亚洲欧美区自拍先锋| 欧美日韩电影在线| 在线视频一区二区免费| 自拍偷拍欧美激情| 久久这里只有精品首页| 欧美男女性生活在线直播观看| 国产福利91精品一区| 免费成人在线影院| 日韩精品乱码av一区二区| 亚洲图片你懂的| 国产亚洲欧美一级| 欧美大片一区二区三区| 欧美日本不卡视频| 欧美视频三区在线播放| 99久久精品免费看国产免费软件| 精品亚洲porn| 亚洲电影一级黄| 精品国产乱码久久久久久闺蜜 | 91精品国产91久久久久久一区二区| 国产一区二区三区免费看| 一区二区久久久久久| 欧美日韩不卡视频| 视频一区欧美日韩| 99精品欧美一区二区蜜桃免费 | 国产三级欧美三级日产三级99 | 日本欧美一区二区在线观看| 欧美国产成人在线| 精品伦理精品一区| 欧美日韩精品一区视频| 麻豆精品视频在线观看视频| 亚洲一卡二卡三卡四卡五卡| 亚洲色图视频网| 欧美一级欧美三级在线观看| 日本道色综合久久| 99久久99久久免费精品蜜臀| 福利一区在线观看| av成人免费在线观看| 波多野结衣在线一区| 国产精品一线二线三线| 久久99精品久久久久| 欧洲亚洲国产日韩| 高清成人在线观看| 亚洲高清免费在线| 亚洲黄色片在线观看| 国产精品成人午夜| 中文字幕中文字幕一区| 国产精品久久久久久久久快鸭| 最新热久久免费视频| 欧美精彩视频一区二区三区| 久久久精品天堂| 国产精品免费视频一区| 中文字幕人成不卡一区| 亚洲一区在线看| 午夜一区二区三区视频| 日日嗨av一区二区三区四区| 日本最新不卡在线| 国模冰冰炮一区二区| 成人午夜视频免费看| 91香蕉视频污在线| 99re成人在线| 欧美一区二区三区免费在线看 | 国产精品久久毛片| **欧美大码日韩| 樱花影视一区二区| 天天综合日日夜夜精品| 毛片一区二区三区| 成人av先锋影音| 精品1区2区3区| 日韩视频国产视频| 国产亚洲污的网站| 亚洲欧美日韩人成在线播放| 亚洲精品视频自拍| 日日夜夜一区二区| 国产精品2024| 色av成人天堂桃色av| 91精品国产综合久久小美女| 精品国产一二三| 亚洲欧洲日韩一区二区三区| 五月婷婷激情综合网| 国产综合色精品一区二区三区| 懂色av中文一区二区三区| 在线播放中文字幕一区| 国产亚洲欧美日韩在线一区| 亚洲免费视频中文字幕| 免费观看日韩av| 国产河南妇女毛片精品久久久| 欧美精品黑人性xxxx| 国产午夜精品一区二区 | 国产亚洲欧美一区在线观看| 国产精品每日更新在线播放网址| 五月婷婷激情综合| 成人精品免费视频| 欧美一区二区视频在线观看2022 | 精品一区二区三区免费毛片爱| 岛国一区二区在线观看| 欧美日韩一二区| 国产精品欧美一区二区三区| 亚洲一卡二卡三卡四卡| av中文字幕一区| 日韩欧美在线123| 亚洲精品videosex极品| 国产福利一区在线| 欧美一区二区视频在线观看 | 91原创在线视频| 欧美日韩你懂得| 18成人在线观看| 国产一区二区三区最好精华液| 欧美午夜一区二区三区| 国产欧美精品国产国产专区| 韩国女主播成人在线观看| 7777精品伊人久久久大香线蕉完整版| 国产女人水真多18毛片18精品视频| 午夜电影网亚洲视频| 91丨porny丨中文| 国产精品久久久久aaaa| 精品一区二区综合| 欧美一级夜夜爽|