亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

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

2020-03-16 20:51:07
字體:
來源:轉載
供稿:網友

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

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

問題描述

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

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

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

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

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

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

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

正則表達式,re.sub,替換

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

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

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


正則表達式,re.sub,替換

經過測試,在絕大多數情況下,能夠從的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標簽替換失敗。

正則表達式,re.sub,替換

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

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

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

正則表達式,re.sub,替換

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

正則表達式,re.sub,替換

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

答疑解惑

這個看起來很奇怪的問題,根本原因在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 redef 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替換不完整的問題及完整解決方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到正則表達式頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产国语videosex另类| 亚洲午夜精品久久久久久久久久久久| 精品亚洲va在线va天堂资源站| 色偷偷av一区二区三区乱| 国产狼人综合免费视频| 日韩精品在线私人| 久久久久中文字幕| 欧美麻豆久久久久久中文| 91精品视频播放| 久久精品国产久精国产思思| 亚洲成人1234| 亚洲影院高清在线| 国产一区二区三区视频在线观看| 亚洲人午夜色婷婷| 日韩av色综合| 97av在线影院| 亚洲女人初尝黑人巨大| 91av视频在线免费观看| 欧美日韩中文字幕| 中文字幕欧美日韩| 日韩美女视频中文字幕| 国产精品丝袜一区二区三区| 精品国产一区二区三区四区在线观看| 热草久综合在线| 亚洲视频电影图片偷拍一区| 国产精品av网站| 国产精品69久久久久| 亚洲欧美成人网| 国外日韩电影在线观看| 国产成人福利网站| 精品久久久久久久大神国产| 久久青草精品视频免费观看| 欧美激情精品久久久久久免费印度| 国产精品福利在线| 久久久久中文字幕| 欧美日韩亚洲国产一区| 国产精品久在线观看| 国产精品一区二区电影| 91精品视频在线看| 日韩有码在线视频| 欧美精品videos性欧美| 久久综合免费视频影院| 最新69国产成人精品视频免费| 日韩中文字幕精品视频| 韩国精品美女www爽爽爽视频| 中文字幕av一区二区三区谷原希美| 91久久国产精品| 中日韩美女免费视频网址在线观看| 亚洲国产精彩中文乱码av在线播放| 欧美激情在线视频二区| 日本精品久久久久影院| 日韩美女免费视频| 96国产粉嫩美女| 亚洲国产精品久久精品怡红院| 精品爽片免费看久久| 韩曰欧美视频免费观看| 欧美午夜精品久久久久久人妖| 在线观看91久久久久久| 日韩在线精品视频| 一本大道久久加勒比香蕉| 热99在线视频| 欧美日韩亚洲视频| 九九视频直播综合网| 国产精品一区二区三区久久久| 亚州精品天堂中文字幕| 亚洲成人激情图| 欧美成人网在线| 久久久久久免费精品| 国产日韩欧美在线| 亚洲精品97久久| 美日韩在线视频| 亚洲综合在线小说| 亚洲欧美色图片| 91国产美女在线观看| 色妞色视频一区二区三区四区| 久久av中文字幕| 美女少妇精品视频| 亚洲美女av在线播放| 日韩av第一页| 国产成人av在线| 亚洲影院色在线观看免费| 欧日韩不卡在线视频| 在线看福利67194| 欧美国产日韩一区二区| 国产精品久久一区| 亚洲va男人天堂| 一区二区中文字幕| 91精品国产91久久久久久吃药| 一本色道久久88综合亚洲精品ⅰ| 性欧美在线看片a免费观看| 欧美色视频日本高清在线观看| 国产精品久久久一区| 亚洲春色另类小说| 亚洲国产精品人久久电影| 91精品在线一区| 大量国产精品视频| 91av国产在线| 亚洲网站在线播放| 欧美日产国产成人免费图片| 国产经典一区二区| 精品视频一区在线视频| 久久久久亚洲精品| www.xxxx精品| 亚洲人a成www在线影院| 亚洲精品第一页| 岛国av一区二区在线在线观看| 色悠久久久久综合先锋影音下载| 狠狠躁夜夜躁人人爽天天天天97| 成人免费福利在线| 欧美性猛交丰臀xxxxx网站| 88国产精品欧美一区二区三区| 亚洲欧美另类人妖| 国产精品青青在线观看爽香蕉| 久久这里只有精品视频首页| 国产成人综合精品在线| 亚洲视屏在线播放| 国产在线精品一区免费香蕉| 日韩av在线电影网| 亚洲综合中文字幕68页| 亚洲人永久免费| 成人性生交大片免费看小说| 欧美亚洲一级片| 国产91色在线|免| 欧美视频在线观看免费网址| 精品一区精品二区| 色婷婷**av毛片一区| 久久久久久这里只有精品| 国产一区二区色| 亚洲综合精品伊人久久| 欧美大学生性色视频| 91青草视频久久| 久久99精品视频一区97| 亚洲一级一级97网| 国产精品入口福利| 国产美女搞久久| 在线播放精品一区二区三区| 亚洲综合在线中文字幕| 亚洲bt欧美bt日本bt| 国产成人精品久久二区二区91| 97色在线视频| 欧美激情视频在线免费观看 欧美视频免费一| 日韩免费视频在线观看| 亚洲精品久久久久久久久久久| 久久久女人电视剧免费播放下载| 欧美激情免费观看| 欧美日韩不卡合集视频| 91亚洲精品在线观看| 97高清免费视频| 国产精品自产拍高潮在线观看| 中文字幕日韩综合av| 欧美日韩成人在线视频| 欧美成人在线免费视频| 成人精品网站在线观看| 亚洲男人第一av网站| 人妖精品videosex性欧美| 久久久国产精品x99av| 久久精品在线播放| 亚洲大胆人体av| 深夜福利一区二区| 亚洲国产精品资源| 久久亚洲综合国产精品99麻豆精品福利| 97热在线精品视频在线观看| 日韩最新中文字幕电影免费看| 久久频这里精品99香蕉|