1. 程式人生 > >(基礎)Python3正則表示式

(基礎)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預設值為0end([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 什麽是正則表達式 正則表達式是對字符串操作的一種邏輯公式,就是 事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符”,這個“規則字符” 來表達對字符的一種過濾邏輯。 正則並不是