国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python爬蟲(十)_正則表達式

這篇具有很好參考價值的文章主要介紹了Python爬蟲(十)_正則表達式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Python爬蟲(十)_正則表達式,python,爬蟲,正則表達式

什么是正則表達式

正則表達式,又稱規(guī)則表達式,通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。 正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一些過濾邏輯。 給定一個正則表達式和另一個字符串,我們可以達到如下的目的:

  • 給定的字符串是否符合正則表達式的過濾邏輯(“匹配”)
  • 通過正則表達式,從文本字符串中獲取到我們想要的特定部分(“過濾”)

Python爬蟲(十)_正則表達式,python,爬蟲,正則表達式

正則表達式匹配規(guī)則

Python爬蟲(十)_正則表達式,python,爬蟲,正則表達式

Python的re模塊

在python中,我們可以使用內(nèi)置的re模塊來使用正則表達式。 有一點需要特別注意的是,正則表達式使用對特殊字符進行轉(zhuǎn)義,所以如果我們要使用原始字符串,只需要一個r前綴,示例:

r'chuanzhiboke\t\.\tpython'

re模塊的一般使用步驟如下:

  1. 使用compile()函數(shù)將正則表達式的字符串形式編譯為一個Pattern對象
  2. 通過Pattern對象提供的一系列方法將文本進行匹配查找,獲得匹配結(jié)果(一個Match對象)
  3. 最后使用Match對象提供的屬性和方法獲得信息,根據(jù)需要進行其他的操作。
compile對象

compile函數(shù)用于編譯正則表達式,生成一個Pattern對象,它的一般使用形式如下:

import re

#將正則表達式編譯為Pattern對象
pattern = re.compile(r'\d+')

在上面,我們已將一個正則表達式編譯成Pattern對象,接下來,我們就可以利用pattern的一系列方法對文本進行匹配查找了。 Pattern對象的一些常用方法主要有:

  • match對象:從起始位置開始查找,一次匹配。
  • search對象:從任何位置開始查找,一次匹配。
  • findall()對象:全部匹配,返回列表。
  • finditer()對象:全部匹配,返回迭代器。
  • spilt()對象:分割字符串,返回列表
  • sub()對象:替換

match 方法 match方法用于查找字符串的頭部(也可以指定起始位置),它是一次匹配,只要找到了一個匹配的結(jié)果返回,而不是查找所有匹配的結(jié)果,它的一般使用形式如下:

match(string[, pos[, endpos]])

其中,string是待匹配的字符串,pos和endpos是可選參數(shù),指定字符串的起始和終點位置,默認值分別是0和len(字符串長度)。因此,當你不指定pos和endpos時,match方法默認匹配字符串的頭部。

當匹配成功時,返回一個Match對象,如果沒有匹配上,則返回None。

>>>import re
>>>pattern = re.compile(r'\d+')  #用于匹配至少一個數(shù)字

>>>m = pattern.match('one12twothree34four')  #查找頭部,沒有匹配
>>>print(m) #如果沒有匹配上,就什么也不輸出

>>>m = pattern.match('one12twothree34four', 2, 10) #從'e'的位置開始匹配,沒有匹配到
>>>print(m)
>>>m = pattern.match('one12twothree34four', 3, 10) #從'1' 的位置開始匹配,正好匹配上
>>>print(m)
<_sre.SRE_Match object at 0x10a42aac0>
>>>m.group(0)   #可忽略0
'12'
>>>m.start(0)   #可忽略0
3
>>>m.end(0)    #可忽略0
5
>>>m.span(0)  #可忽略0
(3, 5)

在上面,當匹配成功時返回一個Match對象,其中:

  • group([group1,…])方法用于獲得一個或多個分組匹配的字符串,當要獲得整個匹配字符串的子串時,可直接使用group()或group(0);
  • start([group])方法用于獲取分組匹配的子串在整個字符串中的起始位置(子串第一個字符的索引),參數(shù)默認值為0;
  • end([group])方法用于獲取分組匹配的子串在整個字符串中的結(jié)束位置(子串最后一個字符的索引+1),參數(shù)默認值是0
  • span([group])方法返回(start[group], end(group))
>>>import re
>>>pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) #表示忽略大小寫
>>>m = pattern.match('hello world wide web')

>>>print(m)  #匹配成功,返回一個Match對象
<_sre.SRE_Match object at 0x10bea83e8>

>>>m.group(0)  #返回匹配成功的整個子串
'Hello World'

>>>m.span(0)   #返回匹配成功的整個子串
(0, 11)

>>>m.group(1)   #返回第一個分組匹配成功的子串
'Hello'

>>>m.span(1)  #返回第一個分組匹配成功
(0, 5)

>>>m.group(2)   #返回第2個分組匹配成功的子串
'World'

>>>m.span(2)     #返回第2個分組匹配成功的子串的位置
(6, 11)

>>>m.groups()   #等價于(m.group(1), m.group(2), ...)
('Hello', 'World')

>>>m.group(3)   #不存在第3個分組
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: no such group

search方法 search方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一個匹配的結(jié)果就返回,而不是查找所有匹配的結(jié)果,它的一般使用形式如下:

search[string[, pos[, endpos]]]

其中,string是待匹配的字符串,pos和endpos是可選參數(shù),指定字符串的起始和終點位置,默認值分別是0和len(字符串長度)。 當匹配成功時,返回一個Match對象,如果沒有匹配上,則返回None。 讓我們看看例子:

>>>import re
>>>pattern = re.compile('\d+')
>>>m = pattern.search('one12twothree34four')  #這里如果使用match方法則不匹配
>>>m
<_sre.SRE_Match object at 0x10cc03ac0>
>>>m.group()
'12'
>>>m = pattern.search('one12twothree34four', 10, 30)   #指定字符串區(qū)間  
>>>m
<_sre.SRE_Match object at 0x10cc03b28>
>>>m.group()
'34'
>>>m.span()
(13, 15)

在看一個例子:

# coding:utf-8
import re
#將正則表達式編譯成Pattern對象
pattern = re.compile(r'\d+')
#使用search()方法查找匹配的字符串,不存在匹配的子串時將不返回
m = pattern.search('hello 123456 789')
if m:
    #使用Match獲得分組信息
    print('matching string:',m.group())
    #起始位置和結(jié)束位置
    print('position: ',m.span())

執(zhí)行結(jié)果:

matching string: 123456
position:(6,12)

findall 方法 上面的match和search方法都是一次匹配,只要找到了一個匹配的結(jié)果就返回。然而,在大多數(shù)時候,我們需要搜索整個字符串,獲得所有匹配的結(jié)果。 findall方法的使用形式如下:

findall(string[, pos[, endpos]])

其中,string是待匹配的字符串,pos和endpos是可選參數(shù),指定字符串的起始和終點位置分別是0和len(字符串長度)。 findall是以列表形式返回全部能匹配到的子串,如果沒有匹配,則返回一個空列表。

import re
pattern = re.compile(r'\d+')  #查找數(shù)字

result1 = pattern.findall('hello 123456 789')
result2 = pattern.findall('one1two2three3four4', 0, 10)

print(result1)
print(2)

執(zhí)行結(jié)果如下:

['123456', '789']
['1', '2']

再來看一個例子:

import re
#re模塊提供一個方法叫compile提供,提供我們輸入一個匹配的規(guī)則
#然后返回一個pattern實例,我們根據(jù)這個規(guī)則去匹配字符串
pattern = re.compile(r'd+\.\d*')

#通過pattern.findall()方法能夠全部匹配到我們得到的字符串
result = pattern.findall("123.141593, 'bigcat', 232312, 3.15")

#findall以列表形式 返回全部能匹配到的子串給result
for item in result:
    print(item)

運行結(jié)果:

123.141593
3.15

finditer方法 finditer方法的行為跟findall的行為類似,也是搜索整個字符串,獲得所有匹配的結(jié)果。但它返回一個順序訪問每一個匹配結(jié)果(Match對象)的迭代器。

#coding:utf-8
import re

pattern = re.compile(r'\d+')

result1 = pattern.finditer('hello 123456 789')
result2 = pattern.finditer('one1two2three3four4', 0, 10)
print(result1)
print(result2)
print('result1....')
for m1 in result1:
    print("matching string:{} position:{}".format(m1.group(), m1.span()))

print('result2....')
for m2 in result2:
    print("matching string:{} position:{}".format(m2.group(), m2.span()))

執(zhí)行結(jié)果:

<type 'callable-iterator'>
<type 'callable-iterator'>
result1.
matching string: 123456, position: (6, 12)
matching string: 789, position: (13, 16)
result2
matching string: 1, position: (3, 4)
matching string: 2, position: (7, 8)

split 方法 split方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:

split(string[, maxsplit])

其中,maxsplit用于指導最大分割次數(shù),不知道靜全部分割。 看看例子:

import re
p = re.compile(r'[\s\,;]+')
print(p.split('a,b;;c   d'))

執(zhí)行結(jié)果:

['a', 'b', 'c', 'd']

sub方法 sub方法用于替換。它的使用形式如下:

sub(repl, string[, count])

其中,repl可以是字符串也可以是一函數(shù):

  • 如果repl是字符串,則會使用repl去替換字符串每一個匹配的子串,并返回替換后的字符串,repl還可以使用id的形式來引用過分組,但不能使用編號0;
  • 如果repl是函數(shù),這個方法應當只接受一個參數(shù)(Match對象),并返回一個字符串用于替換(返回的字符串中不能再引用分組)。
  • count用于指導最多替換次數(shù),不指定時全部替換。

看看例子:

import re
p = re.compile(r'(\w+) (\w+)')  #\w=[A-Za-z0-9]
s = 'hello 123, hello 456'

print(p.sub(r'hello world', s))   #使用'hello world'替換'hello 123''hello 456'
print(p.sub(r'\2 \1', s))

def func(m):
    return 'hi' + ' ' + m.group(2)

print(p.sub(func, s))
print(p.sub(func, s, 1))

執(zhí)行結(jié)果:

hello world, hello world
123 hello, 456 hello
hi 123, hi 456
hi 123, hello 456

匹配中文 在某些情況下,我們想要匹配文本中的漢字,有一點需要注意的是,中文的unicode編碼范圍主要在[u4e00-u9fa5],這里說主要是因為這個范圍并不完整,比如沒有包括全角(中文)標點,不過,在大部分情況下,應該是夠用的。 假設現(xiàn)在想把字符串title=u’你好,hello,世界’中的中文提取出來,可以這么做:

import re
title = u'你好,hello,世界'
pattern = re.compile(u'[\u4e00-\u9fa5]+')
result = pattern.findall(title)

print(result)

注意到,我們在正則表達式前面加上了前綴u,u表示unicode字符串。 執(zhí)行結(jié)果:

['你好', '世界']

注意:貪婪模式與非貪婪模式

  1. 貪婪模式:在整個表達式匹配成功的前提下,盡可能多的匹配(*);
  2. 非貪婪模式:在整個表達式匹配成功的前提下,盡可能少的匹配(?);
  3. Python里數(shù)量詞默認是貪婪的。
實例一:源字符串:abbbc
  • 使用貪婪的數(shù)量詞的正則表達式ab+,匹配結(jié)果:abbb。 *決定了盡可能多匹配b,所以a后面所有的b都出現(xiàn)了。
  • 使用非貪婪的數(shù)量詞的正則表達式ab*?,匹配結(jié)果:a。 即使前面有*,但是?決定了盡可能少匹配b,所以沒有b。
實例二:源字符串:aa<div>test1</div>bb<div>test2</div>cc
  • 使用貪婪的數(shù)量詞的正則表達式:<div>.*</div>
  • 匹配結(jié)果:<div>test1</div>bb<div>test2</div> 這里采用的是貪婪模式。在匹配到第一個“</div>”時已經(jīng)可以使整個表達式匹配成功,但是由于采用的是貪婪模式,所以仍然要向右嘗試匹配,查看是否還有更長的可以成功匹配的子串。匹配到第二個“</div>”后,向右再沒有可以成功匹配的子串,匹配結(jié)束,匹配結(jié)果為“<div>test1</div>bb<div>test2</div>
  • 使用非貪婪的數(shù)量詞的正則表達式:<div>.*?</div>
  • 匹配結(jié)果:<div>test1</div> 正則表達式二采用的是非貪婪模式,在匹配到第一個“</div>”時使整個表達式匹配成功,由于采用的是非貪婪模式,所以結(jié)束匹配,不再向右嘗試,匹配結(jié)果為“<div>test1</div>”。

更多Python的學習資料可以掃描下方二維碼無償領?。。。?/strong>

1)Python所有方向的學習路線(新版)

總結(jié)的Python爬蟲和數(shù)據(jù)分析等各個方向應該學習的技術(shù)棧。

Python爬蟲(十)_正則表達式,python,爬蟲,正則表達式

比如說爬蟲這一塊,很多人以為學了xpath和PyQuery等幾個解析庫之后就精通的python爬蟲,其實路還有很長,比如說移動端爬蟲和JS逆向等等。

Python爬蟲(十)_正則表達式,python,爬蟲,正則表達式

(2)Python學習視頻

包含了Python入門、爬蟲、數(shù)據(jù)分析和web開發(fā)的學習視頻,總共100多個,雖然達不到大佬的程度,但是精通python是沒有問題的,學完這些之后,你可以按照我上面的學習路線去網(wǎng)上找其他的知識資源進行進階。

Python爬蟲(十)_正則表達式,python,爬蟲,正則表達式

(3)100多個練手項目

我們在看視頻學習的時候,不能光動眼動腦不動手,比較科學的學習方法是在理解之后運用它們,這時候練手項目就很適合了,只是里面的項目比較多,水平也是參差不齊,大家可以挑自己能做的項目去練練。

Python爬蟲(十)_正則表達式,python,爬蟲,正則表達式

文章來源地址http://www.zghlxwxcb.cn/news/detail-639868.html

到了這里,關(guān)于Python爬蟲(十)_正則表達式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • 【python】網(wǎng)絡爬蟲與信息提取--正則表達式

    【python】網(wǎng)絡爬蟲與信息提取--正則表達式

    ? ? ? ? 正則表達式是用來簡潔表達一組字符串的表達式。是通用的字符串表達框架,簡潔表達一組字符串的表達式,針對字符串表達“簡潔”和“特征”思想的工具,判斷某字符串的特征歸屬。 ? ? ? ? 用處:表達文本類型的特征;同時查找或替換一組字符串;匹配字符串

    2024年02月19日
    瀏覽(22)
  • 〖Python網(wǎng)絡爬蟲實戰(zhàn)⑨〗- 正則表達式基本原理

    訂閱:新手可以訂閱我的其他專欄。免費階段訂閱量1000+? ????????????????python項目實戰(zhàn) ????????????????Python編程基礎教程系列(零基礎小白搬磚逆襲) 說明:本專欄持續(xù)更新中,目前專欄免費訂閱,在轉(zhuǎn)為付費專欄前訂閱本專欄的,可以免費訂閱付費專欄,

    2023年04月15日
    瀏覽(23)
  • 《零基礎入門學習Python》第060講:論一只爬蟲的自我修養(yǎng)8:正則表達式4

    《零基礎入門學習Python》第060講:論一只爬蟲的自我修養(yǎng)8:正則表達式4

    有了前面幾節(jié)課的準備,我們這一次終于可以真刀真槍的干一場大的了,但是呢,在進行實戰(zhàn)之前,我們還要講講正則表達式的實用方法和擴展語法,然后再來實戰(zhàn),大家多把持一會啊。 我們先來翻一下文檔: 首先,我們要舉的例子是講得最多的 search() 方法,search() 方法

    2024年02月15日
    瀏覽(26)
  • Python正則表達式之學習正則表達式三步曲

    ????????正則表達式描述了一種字符串匹配的模式,可以用來檢查一個串的有無某子串,或者做子串匹配替換,取出子串等操作。也可以說正則表達式就是字符串的匹配規(guī)則,也可以理解為是一種模糊匹配,匹配滿足正則條件的字符串。 ????????1、數(shù)據(jù)驗證(eg:表單驗

    2024年02月15日
    瀏覽(94)
  • python正則表達式-正則基礎

    目錄 一、任一元素 二、匹配特定的字符類別 ? ? ? ? ?1、d? w 三、多個元素 ? ? ? ? ?1、兩位元素 [][] ? ? ? ? ?2、* + ? ? ? ? ? ?3、重復次數(shù) {} ? ? ? ? ?4、位置匹配 ^ $ ? ? ? ? ?5、子表達式() ????????[]:1、[ab]?匹配a或b; ? ? ? ?2、[0-9]?匹配任意一個數(shù)

    2024年02月05日
    瀏覽(22)
  • 老夫的正則表達式大成了,桀桀桀桀?。?!【Python 正則表達式筆記】

    特殊字符 .^$?+*{}[]()| 為特殊字符,若想要使用字面值,必須使用 進行轉(zhuǎn)義 字符類 [] [] 匹配包含在方括號中的任何字符。它也可以指定范圍,例: [a-zA-Z0-9] 表示a到z,A到Z,0到9之間的任何一個字符 [u4e00-u9fa5] 匹配 Unicode 中文 [^x00-xff] 匹配雙字節(jié)字符(包括中文) 在 [] 中

    2024年02月04日
    瀏覽(21)
  • python 正則表達式

    python 正則表達式

    2024年01月17日
    瀏覽(29)
  • PYthon正則表達式

    PYthon正則表達式

    正則表達式是對字符串(包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯。正則

    2024年01月17日
    瀏覽(66)
  • 機器學習與數(shù)據(jù)科學-專題1 Python正則表達式-【正則表達式入門-1】

    機器學習與數(shù)據(jù)科學-專題1 Python正則表達式-【正則表達式入門-1】

    為了完成本關(guān)任務,你需要掌握: 在 Python 中使用正則表達式; 最基礎正則表達式; 正則匹配函數(shù)。 在 Python 中使用正則表達式 正可謂人生苦短,我用 Python。Python 有個特點就是庫非常多,自然擁有正則匹配這種常見的庫,并且此庫已經(jīng)嵌入在 Python 標準庫中,使用起來非常

    2024年01月22日
    瀏覽(109)
  • 速通Python正則表達式

    幾乎所有語言中的正則表達式都有相類似的語法,python亦莫能外。 接下來直觀地看一下最常用的的三大函數(shù) 其中, re.match 要求從頭匹配; search 可以從任意位置匹配,但只返回第一個匹配的值的位置; findall 返回所有符合要求的值。 任意字符 . 匹配除了換行符之外的所有字

    2024年02月06日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包