A. python其實很簡單 第十一章 正則表達式
正則表達式是一個特殊的字元序列,它用來檢查一個字元串是否與某種模式匹配。正則表達式在編譯程序中至關重要,但並不是每個人都需要特別深入的學習和掌握。在此,只介紹一些最基本的應用。
1、元字元
元字元是構成正則表達式的一些特殊字元。在正則表達式中,元字元被賦予了新的含義。
下面介紹一些常用的元字元及其含義:
. 匹配除換行符以外的任意字元。
w 匹配字母、數字、下劃線或漢字。
W 匹配w所匹配的字元以外的字元。
s 匹配單個空白符(包括Tab鍵和換行符)。
S 匹配除s匹配的字元以外的字元。
d 匹配數字。
b 匹配單詞的分界符,如:空格、標點符號或換行符。
^ 匹配字元串的開始
$ 匹配字元串的結束
2、限定符
限定符是在正則表達式中用來指定數量的字元。常用的限定符有:
? 匹配前面的字元0或1次。如:zo?m可以匹配zom和zm,但不能匹配 zoom
+ 匹配前面的字元1或n次。如:zo?m可以匹配zom和zoom,但不能匹配zm
* 匹配前面的字元0或n次。如:zo?m可以匹配zom、zoom和zm
{n} 匹配前面的字元n次。如:zo{2}m可以匹配zoom,但不能匹配zom和zm
{n,} 匹配前面的字元至少n次。如:zo{1,}m可以匹配zom和zoom,但不能匹配zm
{n,m} 匹配前面的字元至少n次,最多m次。如:zo{1,2}m可以匹配zom和zoom,但不能匹配zm
3、方括弧」[ ]」的用途
方括弧「[ ]」里可以列出某個字元范圍。如:[aeiou]表示匹配任意一個母音字母,[zqsl]表示匹配姓氏「趙錢孫李」的拼音第一個字母。
4、排除字元
方括弧」[ ]」中的「^」字元表示排除的意思,如:[^aeiou]表示匹配任意一個非母音字母的字元。
5、選擇字元
字元「|」相當於「或」。如:(^d{3}[-]d{8})|(^d{4}[-]d{7})$可以匹配形如」 - 」或「 - 」的電話號碼格式。
6、轉義字元
對於已經用於定義元字元和限定符的字元,需要加轉義符「」來表示。
如:為了匹配形如「192.168.0.1」的IPv4地址(1~255.0~255.0~255.0~255),可以用這樣的正則表達式:^(25[0-5]|2[0-4][0-9]|[0,1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]).(25[0-5]|2[0-4][0-9]|[0,1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0,1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0,1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$
這里解釋一下第一段IP地址的規則,取值范圍為1~255,可分解為以下情況:
250~255:25[0-5];
200~249:2[0-4][0-9];
100~199:[01]{1}[0-9]{2};
0~99: [0-9]{1}[1-9]
再加上」.」: .
其他三段地址和第一段相似。
7、「( )」可以用於分組
在正則表達式中,用「( )」括起來的部分是一個整體。
8、r(或R)的意義
在正則表達式中,為了保證模式字元串為原生字元串(沒有經過加工處理的字元串),可以在模式字元串前加上一個字元『r』或『R』。例如:
# 這里用到對的re.match()方法接下來介紹
>>> import re # 導入re模塊
>>> re.match('bPy[a-z]+','Python') # 表達式'bPy[a-z]+'不能匹配』Python』
>>> re.match('bPy[a-z]+','Python') # 表達式'bPy[a-z]+'可以匹配』Python』
在上述代碼中,原本要用作匹配單詞開始或結束的元字元』b』在表達式中字元串中會被視為轉義一個字元『b』,為了轉義』b』就不得不再加一個』』符號。
也可以採用下面的方法:
>>> re.match(r'bPy[a-z]+','Python') #加字元』r』,可以保證原生字元串
9、match()方法
Match()方法 嘗試從字元串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match() 就返回 none。
語法格式:
re.match(pattern, string, [flags])
其中,pattern表示匹配的正則表達式;string是要匹配的字元串;flags表示標志位,用於控制正則表達式的匹配方式,如:re.I表示不區分大小寫。
例:
import re #導入re模塊
print(re.match('www', 'www.python.org/').span()) #span()函數可以獲取匹配的位置
print(re.match('org', 'www.python.org'))
輸出結果為:
(0, 3) #在位置0到3(不包括3)匹配成功
None #從起始位置未能匹配成功
10、search()方法
search()方法用於在整個字元串中搜索第一個匹配的值,如果匹配成功,則返回Match對象,否則返回None。
語法格式:
re.search(pattern, string, [flags])
其中,pattern表示匹配的正則表達式;string是要匹配的字元串;flags表示標志位,用於控制正則表達式的匹配方式,如:re.I表示不區分大小寫。
例如:
>>> re.search(r'Pyw+','It's easy to use Python, but it's not easy to learn Python.')
可以看出,目標字元串「It's easy to use Python, but it's not easy to learn Python.」中一共有兩個『Python』,search()方法可以從字元串的起始位置開始查找到『Python』,當找到第一個匹配值後就停止查找,返回位置信息。
match()和search()的比較
match()要求目標字元串的起始位置就能匹配,search()對目標字元串全段進行逐次匹配,只要首次匹配成功就停止匹配。
請看下例:
>>> import re
>>> print(re.match(r'Pyw+','It's easy to use Python, but it's not easy to learn Python.'))
輸出結果:None
11、findall()方法
findall()方法用於在整個字元串中搜索所有匹配的值,如果匹配成功,則返回以匹配值為元素的列表,否則返回空列表。
語法格式:
re.findall(pattern, string[, flags])
其中,pattern表示匹配的正則表達式;string是要匹配的字元串;flags表示標志位,用於控制正則表達式的匹配方式,如:re.I表示不區分大小寫。
例:
>>> import re
>>>print(re.findall(r'Pyw+','It's easy to use Python, but it's not easy to learn Python.'))
輸出結果:['Python', 'Python']
可以看出,findall()的結果沒有指出匹配的具體位置。
12、正則表達式的應用
字元串替換
這里要用到sub()方法。它的語法格式如下:
re.sub(pattern, repl, string [,count] [,flgs])
其中,pattern是模式字元串;repl是用於替換的字元串;string是原字元串;可選參數count為模式匹配後替換的最大次數,省缺表示替換所有的匹配;可選參數flags的意義與前面的方法的該參數一致。
例:
>>> import re
>>> str1='x=36.567 y=123.234'
>>> str2=re.sub('.d+','',str1) #用空格代替小數點及其後的數字
>>> print(str2)
輸出結果:x=36 y=123
分隔字元串
這里要用到split()方法。它的返回值為一個列表,它的語法格式如下:
re.split(pattern, string [,maxsplit] [,flgs])
其中,pattern是模式字元串;string是原字元串;可選參數maxsplit為最大拆分次數,省缺表示拆分所有的匹配;可選參數flags的意義與前面的方法的該參數一致。
例:
>>> import re
>>> str='白日依山盡,黃河入海流。欲窮千里目,更上一層樓!'
>>> re.split(r',|。|!',str) #按照「,」、「。」、「!」分隔字元串。
['白日依山盡', '黃河入海流', '欲窮千里目', '更上一層樓', '']
注意,返回值列表中多出了一個空字元。
B. 學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」後跟一個或多個! 還是一個?
錨點
這需要指定匹配位置。
帶括弧的特殊語法
開課吧廣場-人才學習交流平台-開課吧
C. python正則表達式是什麼
python正則表達式是使用單個字元串來描述、匹配某個句法規則的字元串,常被用來檢索、替換那些符合某個模式(規則)的文本。最初的正則表達式出現於理論計算機科學的自動控制理論和形式化語言理論中。
1950 年,數學家斯蒂芬·科爾·克萊尼利用稱之為「正則集合」的數學符號來描述此模型。肯·湯普遜將此符號系統引入編輯器 QED,隨後是 UNIX 上的編輯器 ed,並最終引入 grep。自此以後,正則表達式被廣泛地應用於各種 UNIX 或類 UNIX 系統的工具中。目前,許多程序設計語言都支持利用正則表達式進行字元串操作。
正則表達式常用的特殊字元:
:將下一個字元標記為一個特殊字元、一個原義字元(Identity Escape,有 "^" "$" "(" ")" "*" "+" "{" "|" 共計12個)、一個向後引用(backreferences)或一個八進制轉義符。例如「n」匹配字元「n」,「 」匹配一個換行符,「\」匹配「」,「(」則匹配「(」。
^:匹配輸入字元串的開始位置。如果設置了正則表達式的多行屬性,「^」也可以匹配「 」或「 」之 後的位置。
[a-z]:字元范圍,匹配指定范圍內的任意字元。例如「[a-z]」可以匹配「a」到「z」范圍內的任意小寫字母字元。
s:匹配任何空白字元,包括空格、製表符、換頁符等,等效於「[f v]」。注意 Unicode 正則表達式 會匹配全形空格符。
D. 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次
E. 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
F. python 正則表達式,怎樣匹配以某個字元串開頭,以某個字元串結尾的情況
python正則匹配以xx開頭以xx結尾的單詞的步驟:
1、假設需要匹配的字元串為:site sea sue sweet see case sse ssee loses需要匹配的為以s開頭以e結尾的單詞。正確的正則式為:sS*?e
2、使用python中re.findall函數表示匹配字元串中所有的可能選項,re是python里的正則表達式模塊。findall是其中一個方法,用來按照提供的正則表達式,去匹配文本中的所有符合條件的字元串。
3、代碼和結果如下:
text ='site sea sue sweet see case sse ssee loses'
re.findall(r'sS*?e',text)
結果為:['site', 'sue', 'see', 'sse', 'ssee']
(6)python正則表達式操作指南擴展閱讀:
python正則匹配,以某某開頭某某結尾的最長子串匹配
代碼如下:
regVersions = re.search(r'(V|v)[0-9].*[0-9]', filename)
if regVersions:
print regVersions.group()
G. python 正則表達式怎麼匹配
Python本不等於正則語言,它只是內部集成了一個正則引擎,這個引擎實現了正則語言的功能,在Python中,這個引擎就是re模塊。所以,你要先『import re』。
下面網頁詳細介紹了正則本身和re模塊,可供參考,基本上覆蓋了所有內容。
H. 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 解析器模塊來執行此類任務 。
I. python 正則表達式是什麼
正則表達式是對字元串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個「規則字元串」,這個「規則字元串」用來表達對字元串的一種過濾邏輯。
正則表達式是用來匹配字元串非常強大的工具,在其他編程語言中同樣有正則表達式的概念,Python同樣不例外,利用了正則表達式,我們想要從返回的頁面內容提取出我們想要的內容就易如反掌了。
正則表達式的大致匹配過程是:
1、依次拿出表達式和文本中的字元比較。
2、如果每一個字元都能匹配,則匹配成功;一旦有匹配不成功的字元則匹配失敗。
3、如果表達式中有量詞或邊界,這個過程會稍微有一些不同。
J. Python正則表達式的幾種匹配用法
下面列出: 1.測試正則表達式是否匹配字元串的全部或部分regex=ur"" #正則表達式
if re.search(regex, subject): do_something()else: do_anotherthing() 2.測試正則表達式是否匹配整個字元串 regex=ur"/Z" #正則表達式末尾以/Z結束
if re.match(regex, subject): do_something()else: do_anotherthing() 3.創建一個匹配對象,然後通過該對象獲得匹配細節(Create an object with details about how the regex matches (part of) a string) regex=ur"" #正則表達式
match = re.search(regex, subject)if match: # match start: match.start() # match end (exclusive): atch.end() # matched text: match.group() do_something()else: do_anotherthing() 4.獲取正則表達式所匹配的子串(Get the part of a string matched by the regex) regex=ur"" #正則表達式
match = re.search(regex, subject)if match: result = match.group()else: result ="" 5. 獲取捕獲組所匹配的子串(Get the part of a string matched by a capturing group) regex=ur"" #正則表達式
match = re.search(regex, subject)if match: result = match.group(1)else: result ="" 6. 獲取有名組所匹配的子串(Get the part of a string matched by a named group) regex=ur"" #正則表達式
match = re.search(regex, subject)if match:result = match.group"groupname")else:result = "" 7. 將字元串中所有匹配的子串放入數組中(Get an array of all regex matches in a string) result = re.findall(regex, subject) 8.遍歷所有匹配的子串(Iterate over all matches in a string) for match in re.finditer(r"<(.*?)/s*.*?//1>", subject) # match start: match.start() # match end (exclusive): atch.end() # matched text: match.group() 9.通過正則表達式字元串創建一個正則表達式對象(Create an object to use the same regex for many operations) reobj = re.compile(regex) 10.用法1的正則表達式對象版本(use regex object for if/else branch whether (part of) a string can be matched) reobj = re.compile(regex)if reobj.search(subject): do_something()else: do_anotherthing() 11.用法2的正則表達式對象版本(use regex object for if/else branch whether a string can be matched entirely) reobj = re.compile(r"/Z") #正則表達式末尾以/Z 結束
if reobj.match(subject): do_something()else: do_anotherthing() 12.創建一個正則表達式對象,然後通過該對象獲得匹配細節(Create an object with details about how the regex object matches (part of) a string) reobj = re.compile(regex) match = reobj.search(subject)if match: # match start: match.start() # match end (exclusive): atch.end() # matched text: match.group() do_something()else: do_anotherthing() 13.用正則表達式對象獲取匹配子串(Use regex object to get the part of a string matched by the regex) reobj = re.compile(regex) match = reobj.search(subject)if match: result = match.group()else: result ="" 14.用正則表達式對象獲取捕獲組所匹配的子串(Use regex object to get the part of a string matched by a capturing group) reobj = re.compile(regex) match = reobj.search(subject)if match: result = match.group(1)else: result ="" 15.用正則表達式對象獲取有名組所匹配的子串(Use regex object to get the part of a string matched by a named group) reobj = re.compile(regex) match = reobj.search(subject)if match: result = match.group("groupname")else: result ="" 16.用正則表達式對象獲取所有匹配子串並放入數組(Use regex object to get an array of all regex matches in a string) reobj = re.compile(regex) result = reobj.findall(subject) 17.通過正則表達式對象遍歷所有匹配子串(Use regex object to iterate over all matches in a string) reobj = re.compile(regex)for match in reobj.finditer(subject): # match start: match.start() # match end (exclusive): match.end() # matched text: match.group()字元串替換 1.替換所有匹配的子串 #用newstring替換subject中所有與正則表達式regex匹配的子串
result = re.sub(regex, newstring, subject) 2.替換所有匹配的子串(使用正則表達式對象) reobj = re.compile(regex) result = reobj.sub(newstring, subject) 字元串拆分 1.字元串拆分 result = re.split(regex, subject) 2.字元串拆分(使用正則表示式對象) reobj = re.compile(regex) result = reobj.split(subject)