(基礎)Python3正則表示式
python正則表示式介紹:
佇列 介紹
在爬蟲的程式中用到了廣度優先順序演算法,該演算法用到了資料結構,當然你用list也可以實現佇列,但是效率不高。現在在此處介紹下:
在容器中有佇列:collection.deque
#佇列簡單測試:
from collections import deque
queue=deque(["peace","rong","sisi"])
queue.append("nick")
queue.append("pishi")
print(queue.popleft())
print(queue.popleft())
print(queue)
集合介紹:
在爬蟲程式中, 為了不重複爬那些已經爬過的網站, 我們需要把爬過的頁面的url放進集合中, 在每一次要爬某一個url之前, 先看看集合裡面是否已經存在. 如果已經存在, 我們就跳過這個url; 如果不存在, 我們先把url放入集合中, 然後再去爬這個頁面.
Python 還 包 含 了 一 個 數 據 類 型—— set ( 集 合 ) 。 集 合 是 一 個 無 序 不 重 復 元素 的 集 。 基 本 功 能 包 括 關 系 測 試 和 消 除 重 復 元 素 。 集 合 對 象 還 支 持 union( 聯
合),intersection(交),difference(差)和 sysmmetric difference(對稱差集)等數學運算。
大括號或 set() 函式可以用來建立集合。 注意:想要建立空集合,你必須使用set() 而不是 {} 。{}用於建立空字典;
集合的建立演示如下:
a={"peace","peace","rong","rong","nick"}
print(a)
"peace" in a
b=set(["peace","peace","rong","rong"])
print(b)
#演示聯合
print(a|b)
#演示交
print(a&b)
#演示差
print(a-b)
#對稱差集
print(a^b)
#輸出:
{'peace', 'rong', 'nick'}
{'peace', 'rong'}
{'peace', 'rong' , 'nick'}
{'peace', 'rong'}
{'nick'}
{'nick'}
正則表示式
在爬蟲時收集回來的一般是字元流,我們要從中挑選出url就要求有簡單的字串處理能力,而用正則表示式可以輕鬆的完成這一任務;
正則表示式的步驟:1,正則表示式的編譯 2,正則表示式匹配字串 3,結果的處理
下圖列出了正則表示式的語法:
在pytho中使用正則表示式,需要引入re模組;下面介紹下該模組中的一些方法;
1.compile和match
re模組中compile用於生成pattern的物件,再通過呼叫pattern例項的match方法處理文字最終獲得match例項;通過使用match獲得資訊;
import re
# 將正則表示式編譯成Pattern物件
pattern = re.compile(r'rlovep')
# 使用Pattern匹配文字,獲得匹配結果,無法匹配時將返回None
m = pattern.match('blog.wpeace.cn')
if m:
# 使用Match獲得分組資訊
print(m.group())
### 輸出 ###
# rlovep
re.compile(strPattern[, flag]):
這個方法是Pattern類的工廠方法,用於將字串形式的正則表示式編譯為Pattern物件。 第二個引數flag是匹配模式,取值可以使用按位或運算子’|’表示同時生效,比如re.I | re.M。另外,你也可以在regex字串中指定模式,比如re.compile(‘pattern’, re.I | re.M)與re.compile(‘(?im)pattern’)是等價的。
可選值有:
re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同)
M(MULTILINE): 多行模式,改變’^’和’$’的行為(參見上圖)
S(DOTALL): 點任意匹配模式,改變’.’的行為
L(LOCALE): 使預定字元類 \w \W \b \B \s \S 取決於當前區域設定
U(UNICODE): 使預定字元類 \w \W \b \B \s \S \d \D 取決於unicode定義的字元屬性
X(VERBOSE): 詳細模式。這個模式下正則表示式可以是多行,忽略空白字元,並可以加入註釋。
Match:
Match物件是一次匹配的結果,包含了很多關於此次匹配的資訊,可以使用Match提供的可讀屬性或方法來獲取這些資訊。
屬性:
string: 匹配時使用的文字。
re: 匹配時使用的Pattern物件。
pos: 文字中正則表示式開始搜尋的索引。值與Pattern.match()和Pattern.seach()方法的同名引數相同。
endpos: 文字中正則表示式結束搜尋的索引。值與Pattern.match()和Pattern.seach()方法的同名引數相同。
lastindex: 最後一個被捕獲的分組在文字中的索引。如果沒有被捕獲的分組,將為None。
lastgroup: 最後一個被捕獲的分組的別名。如果這個分組沒有別名或者沒有被捕獲的分組,將為None。
方法:
group([group1, …]):
獲得一個或多個分組截獲的字串;指定多個引數時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫引數時,返回group(0);沒有截獲字串的組返回None;截獲了多次的組返回最後一次截獲的子串。
groups([default]):
以元組形式返回全部分組截獲的字串。相當於呼叫group(1,2,…last)。default表示沒有截獲字串的組以這個值替代,預設為None。
groupdict([default]):
返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內。default含義同上。
start([group]):
返回指定的組截獲的子串在string中的起始索引(子串第一個字元的索引)。group預設值為0。
end([group]):
返回指定的組截獲的子串在string中的結束索引(子串最後一個字元的索引+1)。group預設值為0。
span([group]):
返回(start(group), end(group))。
expand(template):
將匹配到的分組代入template中然後返回。template中可以使用\id或\g<id>、 \g<name>引用分組,但不能使用編號0。\id與\g<id>是等價的;但\10將被認為是第10個分組,如果你想表達 \1之後是字元'0',只能使用\g<1>0。
pattern:
Pattern物件是一個編譯好的正則表示式,通過Pattern提供的一系列方法可以對文字進行匹配查詢。
Pattern不能直接例項化,必須使用re.compile()進行構造。
Pattern提供了幾個可讀屬性用於獲取表示式的相關資訊:
pattern: 編譯時用的表示式字串。
flags: 編譯時用的匹配模式。數字形式。
groups: 表示式中分組的數量。
groupindex: 以表示式中有別名的組的別名為鍵、以該組對應的編號為值的字典,沒有別名的組不包含在內。
例項方法[ | re模組方法]:
match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]):
這個方法將從string的pos下標處起嘗試匹配pattern;如果pattern結束時仍可匹配,則返回一個Match物件;如果匹配過程中pattern無法匹配,或者匹配未結束就已到達endpos,則返回None。
pos和endpos的預設值分別為0和len(string);re.match()無法指定這兩個引數,引數flags用於編譯pattern時指定匹配模式。
注意:這個方法並不是完全匹配。當pattern結束時若string還有剩餘字元,仍然視為成功。想要完全匹配,可以在表示式末尾加上邊界匹配符'$'。
search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):
這個方法用於查詢字串中可以匹配成功的子串。從string的pos下標處起嘗試匹配pattern,如果pattern結束時仍可匹配,則返回一個Match物件;若無法匹配,則將pos加1重新嘗試匹配;直到pos=endpos時仍無法匹配則返回None。 pos和endpos的預設值分別為0和len(string));re.search()無法指定這兩個引數,引數flags用於編譯pattern時指定匹配模式。
split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):
按照能夠匹配的子串將string分割後返回列表。maxsplit用於指定最大分割次數,不指定將全部分割。
findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]):
搜尋string,以列表形式返回全部能匹配的子串。
finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
搜尋string,返回一個順序訪問每一個匹配結果(Match物件)的迭代器。
sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):
使用repl替換string中每一個匹配的子串後返回替換後的字串。 當repl是一個字串時,可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號0。 當repl是一個方法時,這個方法應當只接受一個引數(Match物件),並返回一個字串用於替換(返回的字串中不能再引用分組)。 count用於指定最多替換次數,不指定時全部替換。
subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):
返回 (sub(repl, string[, count]), 替換次數)。
2.re.match(pattern, string, flags=0)
函式引數說明:
引數 | 描述 |
---|---|
pattern | 匹配的正則表示式 |
string | 要匹配的字串。 |
flags | 標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。 |
匹配成功re.match方法返回一個匹配的物件,否則返回None。
我們可以使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式。
匹配物件方法 | 描述 |
---|---|
group(num=0) | 匹配的整個表示式的字串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。 |
groups() | 返回一個包含所有小組字串的元組,從 1 到 所含的小組號。 |
演示如下:
#re.match.
import re
print(re.match("rlovep","blog.wpeace.cn"))##匹配rlovep
print(re.match("rlovep","blog.wpeace.cn").span())##從開頭匹配rlovep
print(re.match("com","http://blog.wpeace.cn"))##不再起始位置不能匹配成功
##輸出:
<_sre.SRE_Match object; span=(0, 6), match='rlovep'>
(0, 6)
None
例項二:使用group
import re
line = "This is my blog"
#匹配含有is的字串
matchObj = re.match( r'(.*) is (.*?) .*', line, re.M|re.I)
#使用了組輸出:當group不帶引數是將整個匹配成功的輸出
#當帶引數為1時匹配的是最外層左邊包括的第一個括號,一次類推;
if matchObj:
print ("matchObj.group() : ", matchObj.group())#匹配整個
print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一個括號
print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二個括號
else:
print ("No match!!")
#輸出:
matchObj.group() : This is my blog
matchObj.group(1) : This
matchObj.group(2) : my
3re.search方法
re.search 掃描整個字串並返回第一個成功的匹配。
函式語法:
re.search(pattern, string, flags=0)
函式引數說明:
引數 | 描述 |
---|---|
pattern | 匹配的正則表示式 |
string | 要匹配的字串。 |
flags | 標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。 |
匹配成功re.search方法返回一個匹配的物件,否則返回None。
我們可以使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式。
匹配物件方法 | 描述 |
---|---|
group(num=0) | 匹配的整個表示式的字串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。 |
groups() | 返回一個包含所有小組字串的元組,從 1 到 所含的小組號。 |
例項一:
import re
print(re.search("rlovep","blog.wpeace.cn").span())
print(re.search("com","http://blog.wpeace.cn").span())
#輸出:
import re
print(re.search("rlovep","blog.wpeace.cn").span())
print(re.search("com","http://blog.wpeace.cn").span())
例項二:
import re
line = "This is my blog"
#匹配含有is的字串
matchObj = re.search( r'(.*) is (.*?) .*', line, re.M|re.I)
#使用了組輸出:當group不帶引數是將整個匹配成功的輸出
#當帶引數為1時匹配的是最外層左邊包括的第一個括號,一次類推;
if matchObj:
print ("matchObj.group() : ", matchObj.group())#匹配整個
print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一個括號
print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二個括號
else:
print ("No match!!")
#輸出:
matchObj.group() : This is my blog
matchObj.group(1) : This
matchObj.group(2) : my
search和match區別:
re.match只匹配字串的開始,如果字串開始不符合正則表示式,則匹配失敗,函式返回None;而re.search匹配整個字串,直到找到一個匹配。
相關推薦
(基礎)Python3正則表示式
python正則表示式介紹: 佇列 介紹 在爬蟲的程式中用到了廣度優先順序演算法,該演算法用到了資料結構,當然你用list也可以實現佇列,但是效率不高。現在在此處介紹下: 在容器中有佇列:collection.deque #佇列簡單測試: from co
Shell基礎(四):正則表示式、cut、awk、sed命令
前言: 正則表示式是描述字元排列和匹配模式的一種語法規則。主要用於字串的模式分割、匹配、查詢及替換。(主要為了模糊匹配) 1、正則表示式與萬用字元區別 ①萬用字元(* ? [])用來匹配符合條件的檔名
自學python爬蟲(四)Requests+正則表示式爬取貓眼電影
前言 學了requests庫和正則表示式之後我們可以做個簡單的專案來練練手咯!先附上專案GitHub地址,歡迎star和fork,也可以pull request哦~ 地址:https://github.com/zhangyanwei233/Maoyan100.git 正文開始哈哈哈
jmeter教程(七):正則表示式簡介
在後面講關聯和斷言,都會涉及到正則表示式,那麼,就先簡單的介紹一下正則表示式吧。 正則表示式的定義,這裡就不說了,百度裡應該有。正則表示式可以做什麼?處理文字,也只能處理文字。正則表示式,也常被程式設計師戲稱為“火星文”,從這個稱謂可以看出,正則表示式很難看懂。難到什麼程式呢?當你寫完一個比較複
爬蟲入門系列(五):正則表示式完全指南(上)
爬蟲入門系列目錄: 正則表示式處理文字有如疾風掃秋葉,絕大部分程式語言都內建支援正則表示式,它應用在諸如表單驗證、文字提取、替換等場景。爬蟲系統更是離不開正則表示式,用好正則表示式往往能收到事半功倍的效果。 介紹正則表示式前,先來看一個問題,下面這段文字來自豆瓣的某個網頁連結,我對內容
爬蟲入門系列(六):正則表示式完全指南(下)
爬蟲入門系列目錄: 正則表示式是一種更為強大的字串匹配、字串查詢、字串替換等操作工具。上篇講解了正則表示式的基本概念和語法以及re模組的基本使用方式,這節來詳細說說 re 模組作為 Python 正則表示式引擎提供了哪些便利性操作。 >>> import re
Boost(五)——字串處理(二):正則表示式操作
正則表示式: 一些簡單的描述符: . 匹配除換行符以外的任意字元 \w 匹配字母或數字或下劃線或漢字 等價於 '[^A-Za-z0-9_]'。 \s 匹配任意的空白符 \d 匹配數字 \b 匹配單詞的開始或結束 ^ 匹配字串的開始 $ 匹配字串的結束 一、字
jmeter(四):正則表示式提取器
使用jmeter來測試時,經常會碰到需要上下文傳輸資料的情況,如登入後生成的token,在其他頁面的操作,都需傳入這個token。這時,怎麼實現資料傳輸就是我們要考慮的問題。 jmeter提供的後置處理器,如正則表示式提取器,可以很方便的在伺服器響應後,把響應中的資料提取出
萬用字元(WildCard)與正則表示式(Regular Expression)
1.萬用字元(wildcard)就是萬用牌的意思 * 表示匹配任意長度的任意字元 ? 表示匹配一個任意字元 […]則表示匹配括號中列出的字元中的任意一個 [!..]表示不
Google's Python Class(六)——Python 正則表示式
正則表示式是一種用於匹配文字模式的強大的語言。這部分對正則表示式本身做了基本介紹,這些內容足以幫助我們做 Python 練習,並且介紹了在 Python 中如何使用正則表示式。Python 的 “re” 模組提供了對正則表示式的支援。 在 Python 中
IOS使用第三方工具(RegexKitLite)實現正則表示式
1、在寫正則表示式時:所有的’\’都需要轉義,即:’\\’; 2、在很多JS的正則表示式可能是這樣寫,如:’/^\d{1,400}$/’,但是這樣的表示式Objective-C中並不能識別,通過實際除錯得出,應將其寫為:’ ^\\d{1,400}$’(即:去掉表示式頭和尾的’/’)
文字處理(grep、sed)、正則表示式、vim基礎
文字處理三劍客:(grep、sed) grep命令:Global search REgular expression and Print out t
Python3 正則表示式特殊符號及用法(詳細列表)
廢話 有一個美式笑話:我有一個難題,可以用正則表示式解決,那麼,現在我有兩個難題。 美式笑話確實有點冷,只有學過正則表示式的人才能讀懂這個段子。 下面列舉了Python3的所有符號用法,別背,千萬
Java開發筆記(三十八)利用正則表示式校驗字串
前面多次提到了正則串、正則表示式,那麼正則表示式究竟是符合什麼定義的字串呢?正則表示式是程式語言處理字串格式的一種邏輯式子,它利用若干保留字元定義了形形色色的匹配規則,從而通過一個式子來覆蓋滿足了上述規則的所有字串。正則表示式的保留字元主要有:圓括號、方括號、花括號、豎線、橫線、點號、加
Python核心程式設計第三版練習參考(第一章:正則表示式)
1-1 識別後續的字串:“bat”、“bit”、“but”、“hat”、“hit”或者“hut”。 答:'[bh][aiu]t' 1-2 匹配由單個空格分隔的任意單詞對,也就是姓和名。 答:'\w+\s\w+' 1-3 匹配由單個逗號和單個空白符分隔的任何單詞和單個字
3.8 ()在正則表示式中的應用
# 按照正則進行完整的匹配但是結果只顯示分組的內容 f = re.findall('qq(abc)ww','abcdadkgabcddqqabcwwkgjabckggjabcy') print(f) # 按照正則進行完整的匹配,但是結果集中儲存分組資訊組成的元組 f = re.findall('qq
判斷只能輸入包含(中文,數字,英文)的正則表示式。
我們總是對錶達式做各種匹配,下面好用的正則。判斷的表示式有很多種,這是其中的一種。 //只能輸入包含(中文,數字,英文) var char=/^[\u4e00-\u9fa5_a-zA-Z0-9]+$/; //網址是否正確的表示式 var reg=/^([hH][
IP地址和埠號(1024-65535)的正則表示式
工作需要,網上找了好久,分享下能用的。 IP地址: "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." + "(1\\d{2}|2[0-4]\\d|2
python3 正則表示式(更新中)
1、特殊符號(先解釋,後面會有例子) 表示 描述 re1|re2 或的關係 . 匹配任何字元(\n除外),要顯示的匹配.號,需要加\| ^ 匹配字串
python爬蟲從入門到放棄(五)之 正則的基本使用
語言 代碼例子 name 添加 iter ima 制表符 imp things 什麽是正則表達式 正則表達式是對字符串操作的一種邏輯公式,就是 事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符”,這個“規則字符” 來表達對字符的一種過濾邏輯。 正則並不是