2.非貪婪匹配之(.*?)
\d 匹配1個(gè)數(shù)字字符
\w 匹配1個(gè)字母,數(shù)字或下劃線字符
\s 匹配1個(gè)空白字符,如換行符、制表符、普通空格等
\S 匹配1個(gè)非空白字符
\n 匹配1個(gè)換行符,相當(dāng)于按1次Enter鍵
\t 匹配1個(gè)制表符,相當(dāng)于按1次Tab鍵或按8次空格鍵
# .? 匹配1個(gè)任意字符,換行符除外 *? 匹配0個(gè)或多個(gè)表達(dá)式
+? 匹配1個(gè)或多個(gè)表達(dá)式
? 非貪婪限定符,常與.和*配合使用
() 匹配括號(hào)內(nèi)的表達(dá)式,也表示一個(gè)組
例1:
import re
res = '文本A百度新聞文本B,新聞標(biāo)題文本A新聞財(cái)經(jīng)文本B,文本A搜狗新聞文本B新聞網(wǎng)址'
p_source = '文本A(.*?)文本B'
source = re.findall(p_source, res)
print(source)? # ['百度新聞']
例2:
import re
res = '<div class="news-source"><div class="c-img c-img1 c-img-circle news-source-icon_1tdlx c-gap-right-xsmall">網(wǎng)易新聞 2020年12月27日 18:37</div></div>'
p_info = '<div class="news-source">(.*?)</div>'
info = re.findall(p_info, res)
print(info)
3.非貪婪匹配之.*?
import re
res = '<h3>文本C<變化的網(wǎng)址>文本D新聞標(biāo)題</h3>'
p_title = '<h3>文本C.*?文本D(.*?)</h3>'
title = re.findall(p_title, res)
print(title)? # ['新聞標(biāo)題']
import re
res = '<h3 class="c-title"><a href=" 網(wǎng)址" data-clicck="{英文& 數(shù)字}"><em> 阿里巴巴</em> 代碼競(jìng)賽現(xiàn)全球首位AI評(píng)委 能為代碼質(zhì)量打分</a></h3>'
p_title = '<h3 class="c-title">.*?>(.*?)</a>'
title = re.findall(p_title, res)
print(title)? # .*?> 填充我們不要的內(nèi)容? (.*?) 要查找的內(nèi)容
# ['<em> 阿里巴巴</em> 代碼競(jìng)賽現(xiàn)全球首位AI評(píng)委 能為代碼質(zhì)量打分']
res2 = '<h3 class="c-title"><a
p_href = '<h3 class="c-title"><a href="(.*?)"'
href = re.findall(p_href, res2)
print(href)? # ['https://www.baidu.com/']
4.自動(dòng)考慮換行的修飾符re.S
(.*?)和.*?無(wú)法自動(dòng)匹配換行,可以用re.S
re.findall(匹配規(guī)則, 原始文本, re.S)
import re
res = ''' 文本A
? ? ? ? 百度新聞文本B'''
p_source = ' 文本A(.*?)文本B'
source = re.findall(p_source, res, re.S)
print(source)? # ['\n? ? ? ? 百度新聞']
import re
res = '''<h3 class="c-title">
? ? <a
? ? data-click="{
? ? ? ? 英文&數(shù)字
? ? }"
? ? ? ? target="_blank"
? ? >
? ? ? ? <em>阿里巴巴</em> 代碼競(jìng)賽現(xiàn)全球首位
? ? ? ? </a>
? ? '''
p_href = '<h3 class="c-title">.*?<a href="(.*?)"'
p_title = '<h3 class="c-title">.*?>(.*?)</a>'
href = re.findall(p_href, res, re.S)
title = re.findall(p_title, res, re.S)
print(href)? # ['http://baijiahao.baidu.com/s?id=163111&wfr=spider&for=pc']
print(title) # ['\n? ? ? ? <em>阿里巴巴</em> 代碼競(jìng)賽現(xiàn)全球首位\n? ? ? ? ']
5.補(bǔ)充知識(shí)
(1)sub()函數(shù):用于清洗正則表達(dá)式獲取的內(nèi)容
# re.sub(需要替換的內(nèi)容, 替換值, 原字符串)
import re
title = ['<em>阿里巴巴</em> 代碼競(jìng)賽全球首位AI評(píng)委 能為代碼質(zhì)量打分']
title[0] = re.sub('<em>', '', title[0])
title[0] = re.sub('</em>', '', title[0])
print(title[0]) # 阿里巴巴 代碼競(jìng)賽全球首位AI評(píng)委 能為代碼質(zhì)量打分
import re
title = ['<em>阿里巴巴</em> 代碼競(jìng)賽全球首位AI評(píng)委 能為代碼質(zhì)量打分']
title[0] = re.sub('<.*?>', '', title[0])
print(title[0])? # 阿里巴巴 代碼競(jìng)賽全球首位AI評(píng)委 能為代碼質(zhì)量打分
# <.*?> 任何 <>形式的內(nèi)容
# '' 替換后的內(nèi)容
# 第一個(gè)title[0]是替換后的標(biāo)題
# 最后一個(gè)title[0]是原來(lái)的標(biāo)題
(2)中括號(hào)[]的用法:使中括號(hào)里的內(nèi)容不再有特殊含義
import re
company = '* 華能信托'
company1 = re.sub('[*]', '', company)
print(company1)? #? 華能信托