首頁 > 後端開發 > Python教學 > python正規表示式怎麼學習?

python正規表示式怎麼學習?

零下一度
發布: 2017-07-03 15:21:52
原創
1267 人瀏覽過

re 模組讓 Python 語言擁有全部的正規表示式功能。

compile 函數根據一個模式字串和可選的標誌參數產生一個正規表示式物件。該物件擁有一系列方法用於正規表示式匹配和替換。

re.match(pattern, string, flags=0) # 匹配成功返回一个匹配的对象,否则返回none
登入後複製
1 import re2 print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配 (0, 3)3 print(re.match('com', 'www.runoob.com'))        # 不在起始位置匹配 None
登入後複製
 1 import re 2 line = "cats are smarter than dogs" 3 matchObj = re.match(r'(.*) are (.*?) .*', line, re.M|re.I) 4 # matchObj = re.match(r'(.*) are (.*) .*', line, re.M|re.I)  # 结果也一样 5  6 if matchObj: 7     print("matchObj.group()", matchObj.group())     # cats are smarter than dogs 8     print("matchObj.group(1)", matchObj.group(1))   # cats 9     print("matchObj.group(2)", matchObj.group(2))   # smarter10 else:11     print("No match!!")
登入後複製
 1 import re 2 line = "cats are smarter than dogs" 3 matchObj = re.match(r'(.*) are (.*?) (.*) .*', line, re.M|re.I) 4 # matchObj = re.match(r'(.*) are (.*) (.*) .*', line, re.M|re.I)  #这个结果也一样  5  6 if matchObj: 7     print("matchObj.group()", matchObj.group())     # cats are smarter than dogs 8     print("matchObj.group(1)", matchObj.group(1))   # cats 9     print("matchObj.group(2)", matchObj.group(2))   # smarter10     print("matchObj.group(3)", matchObj.group(3))   # than11 else:12     print("No match!!")
登入後複製

使用group(num) 或 groups() 匹配物件函數來取得匹配表達式。

groups():傳回一個包含所有小組字串的元組,從 1 到 所含的小組號碼。

re.search 掃描整個字串並傳回第一個成功的匹配。

print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配  (0, 3)print(re.search('com', 'www.runoob.com').span())  # 不在起始位置匹配  (11, 14)
登入後複製
1 import re2 line = "Cats are smarter than dogs";3 searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)4 if searchObj:5     print("searchObj.group() : ", searchObj.group())     # Cats are smarter than dogs   6     print("searchObj.group(1) : ", searchObj.group(1))   # Cats7     print("searchObj.group(2) : ", searchObj.group(2))   # smarter8 else:9     print("Nothing found!!")
登入後複製
 1 line = "Cats are smarter than dogs" 2 matchObj = re.match(r'dogs', line, re.M | re.I) 3 if matchObj: 4     print("match --> matchObj.group() : ", matchObj.group()) 5 else: 6     print("No match!!") 7  8 matchObj = re.search(r'dogs', line, re.M | re.I) 9 if matchObj:10     print("search --> matchObj.group() : ", matchObj.group())11 else:12     print("No match!!")13 '''14 No match!!15 search --> matchObj.group() :  dogs16 '''
登入後複製

re.match只匹配字串的開始,如果字串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字串,直到找到一個匹配。

1 re.search(pattern, string, flags=0)2 re.sub(pattern, repl, string, count=0, flags=0)
登入後複製

re 模組提供了re.sub用於替換字串中的匹配項。

參數:

  • pattern : 正規中的模式字串。

  • repl : 被替換的字串,也可為一個函數

  • string : 要被尋找已取代的原始字串。

  • count : 模式匹配後替換的最大次數,預設 0 表示替換所有的匹配。


1 phone = "2004-959-559 # 国外电话号码"2 # 删除字符串中的Python注释3 num = re.sub(r'#.*$', "", phone)4 print("电话号码是:", num)        # 电话号码是: 2004-959-559 5 6 # 删除非数字(-)的字符串7 num = re.sub(r'\D', "", phone)8 print("电话号码是:", num)        # 电话号码是: 2004959559
登入後複製

repl參數是一個函數

1 # 将匹配的数字乘于22 def double(matched):3     value = int(matched.group('value'))4     return str(value * 2)5 6 s = 'A23G4HFD567'7 print(re.sub('(?P<value>\d+)', double, s))
登入後複製
re.Ire.Mre.S字符對解析字元。這個標誌影響 w, W, b, B.該標誌透過給予你更靈活的格式以便你將正則表達式寫得更易於理解。

re.I | re.M...多個標誌可以透過位元OR(|)來指定。

正規表示式模式

模式字串使用特殊的語法來表示一個正規表示式:字母和數字表示他們自己。

re.I 使匹配對大小寫不敏感化
使匹配對大小寫不敏感化
多行匹配,影響^ 和$
使. 匹配包括換行在內的所有字符
re.X
n個前面表達式。 re{ n, m}匹配n 到m 次由前面的正規表示式定義的片段,貪婪方式a| b (?imx)(?-imx)(?: re)(?imx: re)在括號中不使用i, m, 或x 可選標誌註.(?#...) 我前向肯定界定符。如果所含正規表示式,以 ... 表示,在目前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。 (?! re)前向否定界定符。與肯定界定符相反;當所含表達式不能在字串當前位置匹配時成功(?> re)匹配的獨立模式,省去回溯。 w匹配字母數字及底線W匹配非字母數字及底線。 dDZ匹配字串結束,如果是存在換行,只匹配到換行前的結束字串。 cz匹配字串結束G匹配最後匹配完成的位置。 b符合一個單字邊界,也就是指單字和空格間的位置。例如, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 B匹配非單字邊界。 'erB' 能符合 "verb" 中的 'er',但不能符合 "never" 中的 'er'。 n, t, 等.符合一個換行符。匹配一個製表符。等等1...9匹配第n個分組的內容。 10符合第n個分組的內容,如果它經過配對。否則指的是八進位碼的表達式。 實例2. 字符類rub [ye]匹配"ruby" 或"rube"[aeiou]匹配中括號內的任一個字母[0-9]
^ 符合字串的開頭
$ 符合字串的結尾。
. 匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。
[...] 用來表示一組字元,單獨列出:[amk] 匹配'a','m'或'k'
[^...] 不在[]中的字元:[^abc] 符合除了a,b,c之外的字元。
re* 符合0個或多個的表達式。
re+ 符合1個或多個的表達式。
re? 配對0個或1個由前面的正規表示式定義的片段,非貪婪方式
re{ n}
G符合括號內的表達式,也表示一個群組
正規表示式包含三種可選標誌:i, m, 或x 。只影響括號中的區域。
正規表示式關閉 i, m, 或 x 可選標誌。只影響括號中的區域。
類似(...), 但不表示一個組
在括號中使用i, m,x 可選標誌 (?-imx: re)
(?#...)
匹配任意非空字元
匹配任意數字,等價於[0-9].
1. 字符匹配 python匹配"python".

[0-9]

[0-9]

類似[0123456789]數字[^aeiou]除了aeiou字母以外的所有字符[^0-9]匹配除了數字外的字符
[a-z] 匹配任何小寫字母
[A-Z] -任何大寫字母

3. 特殊字元

. 符合 "n" 以外的任何單一字元。若要符合包括 'n' 在內的任何字符,請使用象 '[.n]' 的模式。
d 匹配一個數字字元。等價於 [0-9]。
D 匹配一個非數字字元。等價於 [^0-9]。
s 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ fnrtv]。
S 匹配任何非空白字元。等價於 [^ fnrtv]。
w 匹配包括下劃線的任何單字字元。等價於'[A-Za-z0-9_]'。
W 匹配任何非單字字元。等價於 '[^A-Za-z0-9_]'。

 

r表示字串為非轉義的原始字串,讓編譯器忽略反斜杠,即忽略轉義字元。

(.*)第一個符合分組,  * 代表符合除換行符之外的所有字元。

(.*?)第二個匹配分組,*? 後面多個問號,代表非貪婪模式,也就是說只匹配符合條件的最少字符

最後一個.* 沒有括號包圍,所以不是分組,匹配效果和第一個一樣,但是不計入配對結果。

以上是python正規表示式怎麼學習?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板