有這么一個需求,將下面字符串中的鏈接篩選出來
這是第一個圖片<img >,
這是第二個圖片<img src="http://v.infuq.com" />
其中一個是用href,另一個是用src. 使用Python代碼處理如下
import re
def find():
content = '這是第一個圖片<img >,這是第二個圖片<img src="http://v.infuq.com" />'
ret = re.findall(r'(?<=[(src|href)]=")[^"]+(?=")', content)
print(ret)
if __name__ == '__main__':
find()
這個問題的關鍵點就是正則該如何寫,能寫出來正則,那么問題基本就解決了.正則表達式如下
(?<=[(src|href)]=")[^"]+(?=")
然而,上面的理解是不準確的
分析如下
(src|href)這個正則所能匹配的是src和href這兩個串.
[(src|href)]這個正則所能匹配的是( s r c | h r e f ) 這10個字符,而不是src和href這兩個串
因此,我們可以把最終的正則表示成如下
# href和src的最后一個字符分別是f和c
(?<=[fc]=")[^"]+(?=")
但是這樣還是不精確的,假如要匹配的內容是如下
這是第一個圖片<img >,
這是第二個圖片<img src="http://v.infuq.com" >
這是第三個圖片kf="https://img.infuq.com" />
我們最終的需求是要href和src的鏈接,使用 (?<=[fc]=")[^"]+(?=")能把kf="https://img.infuq.com"也匹配出來.
先在Sublime驗證下
在這里插入圖片描述
或者
在這里插入圖片描述
一樣也能精確匹配到需要的內容.
因此Python的代碼如下
import re
def find():
content = '這是第一個圖片<img >,這是第二個圖片<img src="http://v.infuq.com" kf="http://q.infuq.com" />'
# 這種寫法在Sublime可以,但是在Python中不支持
# ret = re.findall(r'((?<=href=")|(?<=kf="))[^"]+(?=")', content)
ret = re.findall(r'(?<=href=")[^"]+(?=")|(?<=src=")[^"]+(?=")', content)
print(ret)
if __name__ == '__main__':
find()