正則表達(dá)式

  • 什么是正則表達(dá)式
    正則表達(dá)式是對字符串操作的一種邏輯共識王滤,就是用事先定義好的一些特定字符以及這些特定字符的組合,組成一個(gè)規(guī)則字符串狰挡,這個(gè)規(guī)則字符串用來表達(dá)對字符串的一種過濾邏輯
    需要注意的是捂龄,正則表達(dá)式非Python獨(dú)有释涛,在Python中通過re模塊來實(shí)現(xiàn)
  • 樣例展示
    正則表達(dá)式常用規(guī)則
  • 用法詳解
    1.常見模式
模式 描述
\w 匹配字母數(shù)字以及下劃線
\W 匹配非字母數(shù)字下劃線
\s 匹配任意空白字符,等價(jià)于[\t\n\r\f].
\S 匹配任意非空白字符
\d 匹配任意數(shù)字倦沧,等價(jià)于[0-9]
\D 匹配任意非數(shù)字
\A 匹配字符串開始
\Z 匹配字符串結(jié)束唇撬,如果存在換行,只匹配到換行錢的結(jié)束字符串
\z 匹配字符串結(jié)束
\G 匹配最后匹配完成的位置
\n 匹配一個(gè)換行符
\t 匹配一個(gè)制表符
^ 匹配字符串的開頭
$ 匹配字符串的末尾
. 匹配任意字符展融,除了換行符窖认,宕re.DOTALL標(biāo)記被指定時(shí),則可以匹配包括換行符的任意字符
[...] 用來表示一組字符告希,單獨(dú)列出:[amk]匹配'a','m'或者'k'
[^...] 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符
* 匹配0個(gè)或者多個(gè)的表達(dá)式
+ 匹配1個(gè)或者多個(gè)的表達(dá)式
? 匹配0個(gè)或者1個(gè)由前面正則表達(dá)式定義的片段扑浸,非貪婪模式
{n} 精確匹配n個(gè)前面表達(dá)式
{n,m} 匹配n到m次由前面的正則表達(dá)式定義的片段,貪婪模式
a|b 匹配a或b
() 匹配括號內(nèi)的表達(dá)式燕偶,也表示一個(gè)組

2.re.match
re.match嘗試從字符串的起始位置匹配一個(gè)模式喝噪,如果不是起始位置匹配成功的話,match()就返回None,用法如下所示

re.match(pattern, string, flag=0)
# 最常規(guī)的用法
import re

content = 'Hello 123 4567 World_This is a Regex Demo'

result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}.*Demo$', content)
print(result)
print(result.span())  # span輸出匹配結(jié)果的范圍
print(result.group())  # group返回匹配結(jié)果

# # 泛匹配(.*就可以把中間字符匹配到指么,但是必須制定起始位置)
result1 = re.match('^Hello.*Demo$',content)
print(result1)
print(result1.group())
print(result1.span())

content1 = 'Hello 1234567 World_This is a Regex Demo'
result2 = re.match('^Hello\s(\d+)\sWorld.*Demo$', content1)
print(result2)
print(result2.group(1))  # 將第一括號括起來的內(nèi)容打印出來酝惧,依次可推group(2)
print(result2.span())

# 貪婪匹配
result3 = re.match('^He.*(\d+).*Demo$',content)
print(result3)
print(result3.group(1))  # 打印結(jié)果為7,意味著‘.*’將前面的數(shù)字全部包含了
#
# 非貪婪匹配
result4 = re.match('^He.*?(\d+).*Demo$',content)#注意看我的細(xì)節(jié):“伯诬?”
print(result4)
print(result4.group(1))

# 匹配模式
content = '''Hello 1234567 World_This
is a
Regex
Demo
'''

result5 = re.match('^He.*?(\d+).*?Demo$',content)#無視換行的下場
print(result5)

result6 = re.match('^He.*?(\d+).*?Demo$',content,re.S)#添加參數(shù)re.S就可以無視換行
print(result6)

#轉(zhuǎn)義
content2 = 'price is $5.00'
result7 = re.match('price is \$5\.00',content2)#添加‘\’即可把特殊字符進(jìn)行轉(zhuǎn)義
print(result7)
#總結(jié):盡量使用泛匹配晚唇,使用括號得到匹配目標(biāo),盡量使用非貪婪模式盗似、有換行符就用re.S#re.search(掃描整個(gè)字符串并返回第一個(gè)成功的匹配)
content3 = 'Extra stings Hello 123232 World_This is a Regex Demo Extra stings'
result8 = re.match('Hello.*?(\d+).*?Demo',content3)
print(result8)#結(jié)果為None哩陕,說明從開始就匹配失敗
result9 = re.search('Hello.*?(\d+).*?Demo',content3)#re.search不管開頭是否相符,只要條件滿足就可以找到
print(result9)
print(result9.group(1))
#總的來說赫舒,能用search就不用match

#匹配演練
html = '''<div id="songs-list">
<h2 class="title">經(jīng)典老歌</h2>
<p class="introduction">
    經(jīng)典老歌列表
</p>
<ul id="list"class="list-group">
    <li data-view="2">一路上有你</li>
    <li data-view="7">
        <a href="/2.mp3"singer="任賢齊">滄海一聲笑</a>
    </li>
    <li data-view="4"class="active">
        <a href="/3.mp3"singer="齊秦">往事隨風(fēng)</a>
    </li>
    <li data-view="6"><a href="/4.mp3"singer="begoud">光輝歲月</a></li>
    <li data-view="5"><a href="/5.mp3"singer="陳慧琳">記事本</a><li>
    <li data-view="5">
        <a href="/6.mp3"singer="鄧麗君"><li class="fa fa-user">但愿人長久</a>
    </li>
</ul>
</div>'''

result = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>',html,re.S)
print(result.group(1),result.group(2))
#
result1 = re.search('<li.*?singer="(.*?)">(.*?)</a>',html,re.S)
print(result1.group(1),result1.group(2))
#
result2 = re.search('<li.*?singer="(.*?)">(.*?)</a>',html)
if result2:
    print(result2.group(1),result2.group(2))#re.search()只找尋一個(gè)結(jié)果
#
#re.findall(搜索字符悍及,以列表的形式返回全部匹配的字符串)
result3 = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>',html,re.S)
#
print(result3)#以元組的形式將所有值輸出
print(type(result3))
for result3 in result3:
    print(result3)
    print(result3[0],result3[1],result3[2])
# #關(guān)于換行問題,“(<a.*?>)?”括號內(nèi)表示一個(gè)組接癌,“并鸵?”表示a標(biāo)簽可能有
result4 = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>',html,re.S)
#
print(result4)
for result4 in result4:
    print(result4[1])

#re.sub(替換字符串中每一個(gè)匹配的字符串后返回替換后的字符串)
#re.sub(正則表達(dá)式,要替換成的字符串扔涧,原字符串)
content6 = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content5 = re.sub('\d+','Replacement',content6)

print(content5)
#在原來的基礎(chǔ)上增加
content4 = re.sub('(\d+)',r'\1 45545',content6)
print(content4)

html = '''<div id="songs-list">
<h2 class="title">經(jīng)典老歌</h2>
<p class="introduction">
    經(jīng)典老歌列表
</p>
<ul id="list"class="list-group">
    <li data-view="2">一路上有你</li>
    <li data-view="7">
        <a href="/2.mp3"singer="任賢齊">滄海一聲笑</a>
    </li>
    <li data-view="4"class="active">
        <a href="/3.mp3"singer="齊秦">往事隨風(fēng)</a>
    </li>
    <li data-view="6"><a href="/4.mp3"singer="begoud">光輝歲月</a></li>
    <li data-view="5"><a href="/5.mp3"singer="陳慧琳">記事本</a></li>
    <li data-view="5">
        <a href="/6.mp3"singer="鄧麗君"><li class="fa fa-user">但愿人長久</a>
    </li>
</ul>
</div>'''

html2 = re.sub('<a.*?>|</a>','',html)#把a(bǔ)標(biāo)簽替換掉
result10 = re.findall('<li.*?>(.*?)</li>',html2,re.S)

print(result10)
#
for result10 in result10:
    print(result10.strip())#去掉換行符

#re.compile(將正則字符串編譯成正則表達(dá)式對象园担,以便于復(fù)用該匹配對象)
content8 = '''
hello
1234545
World_This
is a
Regex
Demo
'''
pattern = re.compile('hello.*Demo',re.S)

result12 = re.match(pattern,content8)

print(result12)
result13 = re.match('hello.*Demo',content8,re.S)
print(result13)

  • 實(shí)例講解
    爬取豆瓣讀書內(nèi)容
import re
import requests

content = requests.get('https://book.douban.com/').text

pattern = re.compile(
    '<li.*?"cover">.*?href="(.*?)" title="(.*?)".*?"more-meta".*?"author">(.*?)</span>.*?"year">(.*?)</span>.*?</li>',
    re.S)
result88 = re.findall(pattern, content)
# print(result88)
for result in result88:
    url, name, author, date = result
    author = re.sub('\s', '', author)  # 使用re.sub將(\n)代替
    date = re.sub('\s', '', author)
    print(url, name, author, date)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市枯夜,隨后出現(xiàn)的幾起案子弯汰,更是在濱河造成了極大的恐慌,老刑警劉巖湖雹,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咏闪,死亡現(xiàn)場離奇詭異,居然都是意外死亡摔吏,警方通過查閱死者的電腦和手機(jī)鸽嫂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門纵装,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人据某,你說我怎么就攤上這事橡娄。” “怎么了癣籽?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵挽唉,是天一觀的道長。 經(jīng)常有香客問我筷狼,道長瓶籽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任埂材,我火速辦了婚禮塑顺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俏险。我一直安慰自己茬暇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布寡喝。 她就那樣靜靜地躺著,像睡著了一般勒奇。 火紅的嫁衣襯著肌膚如雪预鬓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天赊颠,我揣著相機(jī)與錄音格二,去河邊找鬼。 笑死竣蹦,一個(gè)胖子當(dāng)著我的面吹牛顶猜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痘括,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼长窄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纲菌?” 一聲冷哼從身側(cè)響起挠日,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翰舌,沒想到半個(gè)月后嚣潜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椅贱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年懂算,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了只冻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡计技,死狀恐怖喜德,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酸役,我是刑警寧澤住诸,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站涣澡,受9級特大地震影響贱呐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜入桂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一奄薇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抗愁,春花似錦馁蒂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撮珠,卻和暖如春沮脖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芯急。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工勺届, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娶耍。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓免姿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親榕酒。 傳聞我的和親對象是個(gè)殘疾皇子胚膊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Python中的正則表達(dá)式(re) import rere.match #從開始位置開始匹配,如果開頭沒有則無re...
    BigJeffWang閱讀 7,061評論 0 99
  • 搞懂Python 正則表達(dá)式用法 Python 正則表達(dá)式 正則表達(dá)式是一個(gè)特殊的字符序列想鹰,它能幫助你方便的檢查一...
    廈熱閱讀 1,571評論 0 2
  • 正則表達(dá)式澜掩、re模塊、匹配單個(gè)字符杖挣、匹配多個(gè)字符肩榕、匹配開頭結(jié)尾、匹配分組、re模塊的高級用法株汉、python貪婪和非...
    Cestine閱讀 1,435評論 0 1
  • #首先筐乳,python中的正則表達(dá)式大致分為以下幾部分: 元字符 模式 函數(shù) re 內(nèi)置對象用法 分組用法 環(huán)視用法...
    mapuboy閱讀 1,603評論 0 51
  • 今天是父親節(jié)。 早晨起了個(gè)大早乔妈。和面蝙云,切肉,割韭菜路召,準(zhǔn)備包餃子勃刨。 我正在切韭菜,二歲多的二寶股淡,跑到廚房來了身隐。 媽媽...
    杏花塢主人閱讀 913評論 8 18