❶ 學python正則表達式,這一篇就夠了
正則表達式是一個特殊的字元序列,可以幫助您使用模式中保留的專門語法來匹配或查找其他字元串或字元串集。 正則表達式在UNIX世界中被廣泛使用。
註:很多開發人員覺得正則表達式比較難以理解,主要原因是缺少使用或不願意在這上面花時間。
re模塊在Python中提供對Perl類正則表達式的完全支持。如果在編譯或使用正則表達式時發生錯誤,則re模塊會引發異常re.error。
在這篇文章中,將介紹兩個重要的功能,用來處理正則表達式。 然而,首先是一件小事:有各種各樣的字元,這些字元在正則表達式中使用時會有特殊的意義。 為了在處理正則表達式時避免混淆,我們將使用:r'expression'原始字元串。
匹配單個字元的基本模式
編譯標志可以修改正則表達式的某些方面。標志在re模塊中有兩個名稱:一個很長的名稱,如IGNORECASE,和一個簡短的單字母形式,如。
1.match函數
此函數嘗試將RE模式與可選標志的字元串進行匹配。
下面是函數的語法 :
這里是參數的描述 :
pattern : 這是要匹配的正則表達式。
string : 這是字元串,它將被搜索用於匹配字元串開頭的模式。 |
flags : 可以使用按位OR(|)指定不同的標志。 這些是修飾符,如下表所列。
re.match函數在成功時返回匹配對象,失敗時返回None。使用match(num)或groups()函數匹配對象來獲取匹配的表達式。
示例
當執行上述代碼時,會產生以下結果 :
2.search函數
此函數嘗試將RE模式與可選標志的字元串進行匹配。
下面是這個函數的語法 :
這里是參數的描述 :
pattern : 這是要匹配的正則表達式。
string : 這是字元串,它將被搜索用於匹配字元串開頭的模式。 |
flags : 可以使用按位OR(|)指定不同的標志。 這些是修飾符,如下表所列。
re.search函數在成功時返回匹配對象,否則返回None。使用match對象的group(num)或groups()函數來獲取匹配的表達式。
示例
當執行上述代碼時,會產生以下結果 :
3.匹配與搜索
Python提供基於正則表達式的兩種不同的原始操作:match檢查僅匹配字元串的開頭,而search檢查字元串中任何位置的匹配(這是Perl默認情況下的匹配)。
示例
當執行上述代碼時,會產生以下結果 :
4.搜索和替換
使用正則表達式re模塊中的最重要的之一是sub。
模塊
此方法使用repl替換所有出現在RE模式的字元串,替換所有出現,除非提供max。此方法返回修改的字元串。
示例
當執行上述代碼時,會產生以下結果 :
5.正則表達式修飾符:選項標志
正則表達式文字可能包含一個可選修飾符,用於控制匹配的各個方面。 修飾符被指定為可選標志。可以使用異或(|)提供多個修飾符,如前所示,可以由以下之一表示 :
6.正則表達模式
除了控制字元(+ ? . * ^ $ ( ) [ ] { } | ),所有字元都與其自身匹配。 可以通過使用反斜杠將其轉換為控制字元。
7.正則表達式示例
字元常量
字元類
特殊字元類
重復匹配
非貪婪重復
這匹配最小的重復次數 :
用圓括弧分組
反向引用
這與以前匹配的組再次匹配 :
備擇方案
python|perl : 匹配「python」或「perl」
rub(y|le) : 匹配 「ruby」 或 「ruble」
Python(!+|?) : 「Python」後跟一個或多個! 還是一個?
錨點
這需要指定匹配位置。
帶括弧的特殊語法
開課吧廣場-人才學習交流平台-開課吧
❷ python正則表達式是什麼呢
python正則表達式如下:
在python中,所謂的「正則表達式」指的是通常被用來檢索、替換那些符合某個模式的一段文本。具體而言,它的作用是檢測某個字元串是否符合規則和提取網頁字元串中想要的數據。
正則表達式是對字元串提取的一套規則,我們把這個規則用正則裡面的特定語法表達出來,去匹配滿足這個規則的字元串。正則表達式具有通用型,不僅python裡面可以用,其他的語言也一樣適用。
python的編程特點:
速度快:Python的底層是用C語言寫的,很多標准庫和第三方庫也都是用C寫的,運行速度非常快。
免費、開源:Python是FLOSS(自由/開放源碼軟體)之一。使用者可以自由地發布這個軟體的拷貝、閱讀它的源代碼、對它做改動、把它的一部分用於新的自由軟體中。FLOSS是基於一個團體分享知識的概念。
高層語言:用Python語言編寫程序的時候無需考慮諸如如何管理你的程序使用的內存一類的底層細節。
解釋性:一個用編譯性語言比如C或C++寫的程序可以從源文件(即C或C++語言)轉換到一個你的計算機使用的語言(二進制代碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。
❸ Python中的正則表達式
因為正則表達式中有兩組小括弧,即兩個分組
findall會以元組亂銷形式返回所有分組中的內容,即[('127.0.0.1', '.1')]
其中'127.0.01'表示匹配最外層大括弧的內容
'.1'表示匹配'.[0-9]{1,3}'的內容(最後一次重復時為.1)
由於('.[0-9]{1,3}')為需要重復三次的分組,該括弧不能省略
而使用findall就一定會顯示括弧分組的內容
若想只顯示127.0.0.1而不嘩梁游顯示'.1',可考慮使用match方法
返回從字元串起始位置開始,第一次匹配正則表達式的內容
match返回的結果為re.Match對象,可通過group()顯示匹配的字元串,渣襲即127.0.0.1
通過groups()顯示匹配的所有分組,即('127.0.0.1', '.1')
如圖所示:
❹ Python 正則表達式(完整版)
注意點:
以上量詞都是貪婪模式,會盡可能多的匹配,如果要改為非貪婪模式,通過在量詞後面跟隨一個 ? 來實現
斷言不會匹配任何文本,只是對斷言所在的文本施加某些約束
前瞻 : exp1(?=exp2) exp1 後面的內容要匹配exp2
負前瞻 : exp1(?!exp2) exp1 後面的內容不能匹配exp2
後顧: (?<=exp2)exp1 exp1 前面的內容要匹配exp2
負後顧 : (?<!exp2)exp1 exp1 前面的內容不能匹配exp2
例如:我們要查找hello,但是hello後面必須是world,正則表達式可以這樣寫: "(hello)s+(?=world)" ,用來匹配 "hello wangxing" 和 "hello world" 只能匹配到後者的hello
(?(id)yes_exp|no_exp) :對應id的子表達式如果匹配到內容,則這里匹配yes_exp,否則匹配no_exp
❺ Python正則表達式(二)
上節我們說到 Python 正則表達式的基本字元,以及這些字元的用法
今天,我們繼續講講 Python 中一些擴展標記法,以及一些特殊序列
(?...) : 這種擴展標記法以括弧內 ? 開頭,其後第一個字元決定了採用什麼樣的語法。
在 ? 後面添加( 'a', 'i', 'L', 'm', 's', 'u', 'x' 中的一個或多個),然後加上匹配規則。
這些字元對正則表達式設置以下標記,免去設置 flag 參數
注意 : 'a', 'L', 'u' 作為內聯標記是相互排斥的,它們不能結合在一起
括弧分組的非捕獲版本,該分組所匹配的子字元串 不能 在執行匹配後被獲取或是在之後的模式中被引用
可以配合 | 和 {m} 使用
為分組再指定一個組合名
每個組合名只能用一個正則表達式定義,只能定義一次
反向引用一個命名組合
匹配前面那個名字叫 name 的命名組中匹配到的字元串
注釋信息,裡面的內容會被忽略。
哈哈,是不是沒看懂,沒事,舉個栗子
看看,是不是一下子就明了了。
哈哈,這個又看不懂?
思考一下,既然有根據後面字元斷言的,那麼根據前面字元來斷言,也是很合理的,
如果給定的 id 或 name 存在,將會嘗試匹配 yes-pattern ,否則就嘗試匹配 no-pattern , no-pattern 可選,也可以被忽略。
是不是有點像 if else 三目運算,其中 id 和 name 是分組 id 、和指定的分組名 name
照舊,舉個栗子吧
看了栗子是不是有點糊塗呢,我們來解析一下這個正則表達式
其結果匹配的就是 <[email protected]> 和 [email protected] 。
而不會匹配 <[email protected] ' 和 <[email protected]
但是上面的第三個結果為啥不一樣呢?
因為 findall 允許返回空匹配的,在有 ? 的情況下,所以它會分兩種情況去匹配
今天講了一些擴展標記法,其實沒那麼難,多看看例子,多練習練習。
下節將介紹 re 模塊各函數的用法,敬請期待......
❻ 從零開始學Python爬蟲(四):正則表達式
Regular Expression, 正則表達式, 種使 表達式的 式對字元串進 匹配的語法規則。
我們抓取到的 源代碼本質上就是 個超 的字元串, 想從 提取內容。 正則再合適不過了。
正則的優點: 速度快, 效率 , 准確性 正則的缺點: 新 上 難度有點 。
不過只要掌握了正則編寫的邏輯關系, 寫出 個提取 內容的正則其實並不談旦復雜
正則的語法: 使 元字元進 排列組合 來匹配字元串
在線測試正則表達式網址:
https://tool.oschina.net/regex/
元字元: 具有固定含義的特沖旦殊符號 常 元字元:
量詞: 控制前 的元字元出現的次數
貪婪匹配和惰性匹配
這兩個要著重的說 下,因為我們寫爬 的最多的就是這個惰性匹配。
先看案例
那麼接下來的問題是, 正則我會寫了, 怎麼在python程序中使 正則呢?答案是re模塊
re模塊中我們只需要記住這么 個功能就 夠我們使 了。散侍擾
下面一個案例,是練慣用正則表達式提取豆瓣電影top250的數據並保存,一起來學一下吧。
❼ python的正則表達式
1,正則表達式的一些內容
正則表達式主要是用來匹配文本中需要查找的內容,例如在一片文章中找出電話號碼,就中國的來說11位純數字(不說座機),則使用"d{11}" 意味匹配數字11次,就能准確的查找出文本中的電話號碼. 還有就是在編寫網路爬蟲的時候需要提取很多超鏈接再次進行爬取,使用正則表達式就很方便.直接匹配http開頭就行,當然也可以使用beautifulsoup的select方法.
看下面的程序看看正則表達提取文本中的郵箱:
w 匹配字母,數字,下劃線
+ 匹配1次或者多次
re是正則表達式的工具包,工具包出錯的話在anaconda的命令行輸入"pip install re"安裝,其他的工具包也是如此.
re.compile()中的r示意不是轉義字元,也就是保持後面字元串原樣,findall返回一個列表.下面還有一個版本的程序略有不同.
compile的另一個參數re.IGONORECASE(忽略大小寫),還可以是re.DORALL,多行模式,具體功能也是模糊不清,不過在使用通配符 . 匹配的時候加上re.DOTALL參數能夠匹配換行.如果希望忽略大小寫和多行模式都開啟可以使用re.compile(r'....',re.IGNORECASE|re.DOTALL) .
表達式使用( ),對匹配到的內容分為3組 也就是(w+)出現字母,數字,下劃線一次或多次,這個分組就是下面使用match對象的grou()方法的時候的參數.不給參數和參數0都是得到整個匹配到的內容, 參數1得到第一個括弧匹配到的內容,以此類推參數2和3,如果沒有括弧分組的話使用參數會出現錯誤.
search( )查找和正則式匹配的內容,只匹一次後面的那個找不到.返回一個match對象
w 匹配字母,數字,下劃線
W 匹配字母,數字.下劃線之外的所有字元
d 匹配數字
D 匹配非數字
s 匹配空格,製表符,換行符
S匹配除空格製表符,換行符之外的其他字元
[ .... ]定義自己的匹配,如[aeiouAEIOU ]匹配所有的母音字母,注意不是匹配單詞.
{最少次數,最多次數},例如{3,9} 匹配3-9次,{ ,10}匹配0-10次. 默認為匹配最多次數(貪心匹配),非貪心模式在後面加上問號
? 可選 0次或者1次吧
+匹配1次或多次
*匹配0次或者多次
^ 判斷開頭 ^d 如果待匹配串是數字開頭則返回第一個數字
$判斷結尾 d$ 如果待匹配串是數字結尾則返回最後一個數字
. 通配符,匹配除換行之外的所有字元
d{11} 匹配數字11次
. * 匹配所有字元除 換行
[a-zA-Z0-9._%+-] 小寫和大寫字母、數字、句點、下劃線、百分號、加號或短橫
[a-zA-Z]{2,4} 匹配字母 2 - 4次
❽ Python中正則表達式的常用元字元有哪些呢
Python 中常用的正則表達式元字元包括:
.:匹配任意一個字元(除了換行符 )。
^:匹配字元串的開頭。
$:匹配字元串的結尾。
*:匹配前面的字元 0 次或多次。
+:匹配前面的字元 1 次或多次。
?:匹配前面的字元 0 次或 1 次。
{n}:匹配前面的字元恰好 n 次。
{m,n}:匹配前面的字元至少 m 次,至多 n 次。
[]:匹配方括弧內的任意一個字元。
():標記一個子表達式的開始和結束位置。
|:表示或,匹配符號左右兩邊的任意一個表達式。
:用來轉義元字元或者表示特殊字元。
這些耐散元字元在正則表達式晌畝握中經常使用,可以組合成各種復雜的宴慶正則表達式,用於字元串的匹配和替換等操作。
❾ Python常用的正則表達式處理函數詳解
正則表達式是一個特殊的字元序列,用於簡潔表達一組字元串特徵,檢查一個字元串是否與某種模式匹配,使用起來十分方便。
在Python中,我們通過調用re庫來使用re模塊:
import re
下面介紹Python常用的正則表達式處理函數。
re.match函數
re.match 函數從字元串的起始位置匹配正則表達式,返回match對象,如果不是起始位置匹配成功的話,match()就返回None。
re.match(pattern, string, flags=0)
pattern:匹配的正則表達式。
string:待匹配的字元串。
flags:標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。具體參數為:
re.I:忽略大小寫。
re.L:表示特殊字元集 w, W, , B, s, S 依賴於當前環境。
re.M:多行模式。
re.S:即 . ,並且包括換行符在內的任意字元(. 不包括換行符)。
re.U:表示特殊字元集 w, W, , B, d, D, s, S 依賴於 Unicode 字元屬性資料庫。
re.X:為了增加可讀性,忽略空格和 # 後面的注釋。
import re #從起始位置匹配 r1=re.match('abc','abcdefghi') print(r1) #不從起始位置匹配 r2=re.match('def','abcdefghi') print(r2)運行結果:
其中,span表示匹配成功的整個子串的索引。
使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。
group(num):匹配的整個表達式的字元串,group() 可以一次輸入多個組號,這時它將返回一個包含那些組所對應值的元組。
groups():返回一個包含所有小組字元串的元組,從 1 到 所含的小組號。
import re s='This is a demo' r1=re.match(r'(.*) is (.*)',s) r2=re.match(r'(.*) is (.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())運行結果:
上述代碼中的(.*)和(.*?)表示正則表達式的貪婪匹配與非貪婪匹配。
re.search函數
re.search函數掃描整個字元串並返回第一個成功的匹配,如果匹配成功則返回match對象,否則返回None。
re.search(pattern, string, flags=0)
pattern:匹配的正則表達式。
string:待匹配的字元串。
flags:標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
import re #從起始位置匹配 r1=re.search('abc','abcdefghi') print(r1) #不從起始位置匹配 r2=re.search('def','abcdefghi') print(r2)運行結果:
使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。
group(num=0):匹配的整個表達式的字元串,group() 可以一次輸入多個組號,這時它將返回一個包含那些組所對應值的元組。
groups():返回一個包含所有小組字元串的元組,從 1 到 所含的小組號。
import re s='This is a demo' r1=re.search(r'(.*) is (.*)',s) r2=re.search(r'(.*) is (.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())運行結果:
從上面不難發現re.match與re.search的區別:re.match只匹配字元串的起始位置,只要起始位置不符合正則表達式就匹配失敗,而re.search是匹配整個字元串,直到找到一個匹配為止。
re.compile 函數
compile 函數用於編譯正則表達式,生成一個正則表達式對象,供 match() 和 search() 這兩個函數使用。
re.compile(pattern[, flags])
pattern:一個字元串形式的正則表達式。
flags:可選,表示匹配模式,比如忽略大小寫,多行模式等。
import re #匹配數字 r=re.compile(r'd+') r1=r.match('This is a demo') r2=r.match('This is 111 and That is 222',0,27) r3=r.match('This is 111 and That is 222',8,27) print(r1) print(r2) print(r3)運行結果:
findall函數
搜索字元串,以列表形式返回正則表達式匹配的所有子串,如果沒有找到匹配的,則返回空列表。
需要注意的是,match 和 search 是匹配一次,而findall 匹配所有。
findall(string[, pos[, endpos]])
string:待匹配的字元串。
pos:可選參數,指定字元串的起始位置,默認為0。
endpos:可選參數,指定字元串的結束位置,默認為字元串的長度。
import re #匹配數字 r=re.compile(r'd+') r1=r.findall('This is a demo') r2=r.findall('This is 111 and That is 222',0,11) r3=r.findall('This is 111 and That is 222',0,27) print(r1) print(r2) print(r3)運行結果:
re.finditer函數
和 findall 類似,在字元串中找到正則表達式所匹配的所有子串,並把它們作為一個迭代器返回。
re.finditer(pattern, string, flags=0)
pattern:匹配的正則表達式。
string:待匹配的字元串。
flags:標志位,用於控制正則表達式的匹配方式,如是否區分大小寫,多行匹配等。
import re r=re.finditer(r'd+','This is 111 and That is 222') for i in r: print (i.group())運行結果:
re.split函數
將一個字元串按照正則表達式匹配的子串進行分割後,以列表形式返回。
re.split(pattern, string[, maxsplit=0, flags=0])
pattern:匹配的正則表達式。
string:待匹配的字元串。
maxsplit:分割次數,maxsplit=1分割一次,默認為0,不限次數。
flags:標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等。
import re r1=re.split('W+','This is 111 and That is 222') r2=re.split('W+','This is 111 and That is 222',maxsplit=1) r3=re.split('d+','This is 111 and That is 222') r4=re.split('d+','This is 111 and That is 222',maxsplit=1) print(r1) print(r2) print(r3) print(r4)運行結果:
re.sub函數
re.sub函數用於替換字元串中的匹配項。
re.sub(pattern, repl, string, count=0, flags=0)
pattern:正則中的模式字元串。
repl:替換的字元串,也可為一個函數。
string:要被查找替換的原始字元串。
count:模式匹配後替換的最大次數,默認0表示替換所有的匹配。
import re r='This is 111 and That is 222' # 刪除字元串中的數字 r1=re.sub(r'd+','',r) print(r1) # 刪除非數字的字元串 r2=re.sub(r'D','',r) print(r2)運行結果:
到此這篇關於Python常用的正則表達式處理函數詳解的文章就介紹到這了,希望大家以後多多支持!
❿ Python 中正則表達式全部語法速查
它們不匹配自己,在正則中具有其它的意義,匹配自己需要轉義.
元字元的完整列表:
它們不用來代表字元,用來實現一些特殊的匹配功能
可以給 group() , start() , end() , span() 傳入參數 分組的序號 ,以獲取模式中特定分組匹配到的內容.默認參數為0.
組從0開始從左到右編號,它始終存在.要確定編號,只需計算從左到右的左括弧字元.
(?參數)
(?a:表達式)
(?aiLmsux-imsx:表達式)
(?#注釋內容)
(?P<組名>表達式) + result.group('組名') :
(?P<組名>表達式) + (?P=<組名>) :
(?:表達式)
(?=表達式)
(?!表達式)
(?<=表達式)
(?<!表達式)
(?(id/name)yes-pattern|no-pattern)
如果你匹配固定字元串或單個字元類,如果你匹配固定字元串或單個字元類,並且你沒有使用任何 re 功能,例如 IGNORECASE 標志,那麼正則表達式的全部功能可能不是必需的。 字元串有幾種方法可以使用固定字元串執行操作,它們通常要快得多,因為實現是一個針對此目的而優化的單個小 C 循環,而不是大型、更通用的正則表達式引擎。
在轉向 re 模塊之前,請考慮是否可以使用更快更簡單的字元串方法解決問題
正則默認是貪婪模式(匹配為盡可能 少 的文字):
非貪婪:匹配為盡可能少的文字
*? 、 +? 、 ?? 、 {m,n}?
使用正則表達式解析 HTML 或 XML 很痛苦。HTML 和 XML 有特殊情況會破壞明顯的正則表達式;當你編寫正則表達式處理所有可能的情況時,模式將非常復雜。 使用 HTML 或 XML 解析器模塊來執行此類任務 。