python re模塊

前面已經(jīng)初步介紹了正則式的語法規(guī)則和re模塊的方法凄诞。
這次主要舉了幾個(gè)例子思恐,看看re模塊在實(shí)際工作中的使用炮温。

1. re.match

設(shè)定一個(gè)字符串

    content = '2005-2018 douban.com, all rights reserved 北京豆網(wǎng)科技有限公司'
  • 常規(guī)匹配
    result = re.match('2005-\d{4}\s\w{6}\W\w{3}\W{2}\w{3}\s\w{6}\s\w{8}\s.*司$', content)
    print(result.group())

輸出結(jié)果

> 2005-2018 douban.com, all rights reserved 北京豆網(wǎng)科技有限公司
  • 泛匹配
    result = re.match('^2005.*司$', content)
    print(result.group())

輸出結(jié)果

> 2005-2018 douban.com, all rights reserved 北京豆網(wǎng)科技有限公司
  • 目標(biāo)匹配(括號及group的用法)
    content = '2005-2018 douban.com, all rights reserved 北京豆網(wǎng)科技有限公司'
    result = re.match('^(\d{4})-(\d{4}).*司$', content)
    print(result.group())
    print(result.group(1))
    print(result.groups(), type(result.groups()))
    print(result.group(2))

輸出結(jié)果

> 2005-2018 douban.com, all rights reserved 北京豆網(wǎng)科技有限公司
> 2005
> ('2005', '2018') <class 'tuple'>
> 2018
  • re.match從字符串的開頭匹配
    (將常規(guī)匹配中表達(dá)式 改成 005-\d{4}...都不能匹配成功)
  • group與groups的用法:
    1. group()查看正則式所匹配內(nèi)容
    2. group(1)查看正則式中第一個(gè)括號里面的內(nèi)容
    3. groups()將正則式中所有括號里面的內(nèi)容組成一個(gè)tuple横侦,提取字符串要用切片的方法result.groups()[0]
    4. group() 里面的參數(shù)是從1開始的彻犁,不是0局待。
  • 匹配模式的參數(shù)使用 (re.S舉例)
    將content內(nèi)容中增加換行符‘\n'
content1 = '2005-2018 douban.com, all rights reserved \n 北京豆網(wǎng)科技有限公司'

使用匹配模式的參數(shù)re.S斑响,忽略換行符匹配
(具體參數(shù)規(guī)則請查閱上次的內(nèi)容)

    result = re.match('^2005.*司$', content1, re.S)
    result_error = re.match('^2005.*司$', content1)

    print(result.group())
    print(result_error)

原本正則式.*不會匹配換行符,但是填寫參數(shù)re.S后钳榨,
輸出結(jié)果就能匹配到字符串中的換行符了

> 2005-2018 douban.com, all rights reserved 
 北京豆網(wǎng)科技有限公司
> None

2. re.search

!!! 為匹配方便舰罚,能用search就不用match !!!

  • 貪婪匹配
    result1 = re.search('2018.*(\w{6})', content)
    print(result1.group(1))

輸出結(jié)果

> 科技有限公司
  • 非貪婪匹配
    result2 = re.search('2018.*?(\w{6})', content)
    print(result2.group(1))

輸出結(jié)果

> douban

區(qū)別:
匹配目標(biāo)(\w{6})是想截取2018以后的連續(xù)6個(gè)字母數(shù)字及下劃線
貪婪匹配中.*,盡可能多的匹配到中間的字符薛耻,只剩下最后6個(gè)字符作為匹配目標(biāo)
非貪婪匹配.*?营罢,卻截取與匹配目標(biāo)最接近的6個(gè)字符

3. re.findall

案例:正則式爬取豆瓣圖書相關(guān)信息
先獲得單個(gè)html源碼

url = 'https://book.douban.com/top250?icn=index-book250-all'
response = requests.get(url)
content = response.text

這里只截取書名和價(jià)格


網(wǎng)頁源碼

注意使用非貪婪匹配,否則不能截取所有信息

    results = re.findall('title="(\w+)".*?<p class="pl">.*?(\d{2}\.\d{2}).*?</p>', content, re.S)
    print(results)

輸出結(jié)果是由tuple組成的list

[('追風(fēng)箏的人', '29.00'), ('小王子', '22.00'), ('圍城', '19.00'), ('解憂雜貨店', '39.50'), ('活著', '12.00'), ('白夜行', '29.80'), ('挪威的森林', '18.80'), ('嫌疑人X的獻(xiàn)身', '28.00'), ('三體', '23.00'), ('不能承受的生命之輕', '23.00'), ('紅樓夢', '59.70'), ('夢里花落知多少', '20.00'), ('看見', '39.80'), ('百年孤獨(dú)', '39.50'), ('何以笙簫默', '15.00'), ('可試讀', '19.50'), ('白夜行', '39.50'), ('三體Ⅱ', '32.00'), ('飄', '40.00'), ('送你一顆子彈', '25.00'), ('三體Ⅲ', '38.00')]

4. re.finditer

和 findall 類似昭卓,在字符串中找到正則表達(dá)式所匹配的所有子串愤钾,并把它們作為一個(gè)迭代器返回

    results = re.finditer('title="(\w+)".*?<p class="pl">.*?(\d{2}\.\d{2}).*?</p>', content, re.S)
    print(results)

返回一個(gè)迭代器的對象
<callable_iterator object at 0x000001D2FDA98EB8>
要用循環(huán)語句才能調(diào)用:

    for result in results:
        print(result.groups())

5. re.compile

用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式(Pattern)對象候醒,作為參數(shù)供其他re模塊函數(shù)使用

  • 以findall改編一下:
    pattern = re.compile('title="(\w+)".*?<p class="pl">.*?(\d{2}\.\d{2}).*?</p>', re.S)
    results = re.finditer(pattern, content)

6. re.sub

用于替換字符串中的匹配項(xiàng)

  • 找出連續(xù)4個(gè)數(shù)字能颁,替換為hello welcome
    content = '2005-2018 douban.com, all rights reserved 北京豆網(wǎng)科技有限公司'
    result = re.sub('\d{4}', 'hello welcome', content, 1)
    print(result)

輸出結(jié)果為

> hello welcome-2018 douban.com, all rights reserved 北京豆網(wǎng)科技有限公司
  • 1表示匹配一次,所以只有2005替換了
  • 參數(shù)默認(rèn)為0倒淫,表示符合條件的伙菊,全部替換
  • 替換括號內(nèi)的內(nèi)容
    result = re.sub('(\d{4})-(\d{4})', r'\2 welcome', content)
    print(result)

輸出結(jié)果為:

> 2018 welcome douban.com, all rights reserved 北京豆網(wǎng)科技有限公司
  • 按照括號順序,可以將匹配內(nèi)容調(diào)用到替換內(nèi)容中, eg. r'\2 ...'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敌土,一起剝皮案震驚了整個(gè)濱河市镜硕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌返干,老刑警劉巖兴枯,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矩欠,居然都是意外死亡财剖,警方通過查閱死者的電腦和手機(jī)悠夯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躺坟,“玉大人杉允,你說我怎么就攤上這事拯坟∷豕Γ” “怎么了果善?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長美侦。 經(jīng)常有香客問我产舞,道長,這世上最難降的妖魔是什么音榜? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任庞瘸,我火速辦了婚禮,結(jié)果婚禮上赠叼,老公的妹妹穿的比我還像新娘擦囊。我一直安慰自己,他們只是感情好嘴办,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布瞬场。 她就那樣靜靜地躺著,像睡著了一般涧郊。 火紅的嫁衣襯著肌膚如雪贯被。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天妆艘,我揣著相機(jī)與錄音彤灶,去河邊找鬼。 笑死批旺,一個(gè)胖子當(dāng)著我的面吹牛幌陕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汽煮,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼搏熄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暇赤?” 一聲冷哼從身側(cè)響起心例,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鞋囊,沒想到半個(gè)月后止后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溜腐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年译株,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了微饥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡古戴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矩肩,到底是詐尸還是另有隱情现恼,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布黍檩,位于F島的核電站叉袍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏刽酱。R本人自食惡果不足惜喳逛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棵里。 院中可真熱鬧润文,春花似錦、人聲如沸殿怜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽头谜。三九已至骏掀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柱告,已是汗流浹背截驮。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留际度,地道東北人葵袭。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像甲脏,于是被迫代替她去往敵國和親眶熬。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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

  • Python中的正則表達(dá)式(re) import rere.match #從開始位置開始匹配块请,如果開頭沒有則無re...
    BigJeffWang閱讀 7,081評論 0 99
  • re模塊手冊 本模塊提供了和Perl里的正則表達(dá)式類似的功能娜氏,不關(guān)是正則表達(dá)式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,009評論 0 13
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,381評論 0 5
  • #首先墩新,python中的正則表達(dá)式大致分為以下幾部分: 元字符 模式 函數(shù) re 內(nèi)置對象用法 分組用法 環(huán)視用法...
    mapuboy閱讀 1,609評論 0 51
  • 放假的第一天贸弥,我們?nèi)フ萘恕R驗(yàn)橐ソ咏憬愫Tǎ邇蓚€(gè)小時(shí)绵疲,因?yàn)槲腋杏X有點(diǎn)難受所以在睡覺哲鸳。等我醒了媽媽給我講了...
    94730a6c6c3e閱讀 229評論 0 0