一.常用正規表示式符號和語法:
'.' 匹配所有字串,除\n以外
『-』 表示範圍[0-9]
'*' 匹配前面的子表示式零次或多次。要匹配 * 字元,請使用 \*。
'+' 匹配前面的子表示式一次或多次。要匹配 + 字元,請使用 \+
'^' 匹配字串開頭
『$』 匹配字串結尾 re
'\' 轉義字元, 使後乙個字元改變原來的意思,如果字串中有字元*需要匹配,可以\*或者字符集[*] re.findall(r'3\*','3*ds')結['3*']
'*' 匹配前面的字元0次或多次 re.findall("ab*","cabc3abcbbac")結果:['ab', 'ab', 'a']
『?』 匹配前乙個字串0次或1次 re.findall('ab?','abcabcabcadf')結果['ab', 'ab', 'ab', 'a']
'' 匹配前乙個字元m次 re.findall('cb','bchbchcbfbcbb')結果['cb', 'cb']
'' 匹配前乙個字元n到m次 re.findall('cb','bchbchcbfbcbb')結果['cbb']
'\w' 匹配字母和數字,等於[a-za-z0-9] re.findall('\w','alex123,./;;;')結果['a', 'l', 'e', 'x', '1', '2', '3']
'\w' 匹配非英文本母和數字,等於[^a-za-z0-9] re.findall('\w','alex123,./;;;')結果[',', '.', '/', ';', ';', ';']
'\s' 匹配空白字元 re.findall('\s','3*ds \t\n')結果[' ', '\t', '\n']
'\s' 匹配非空白字元 re.findall('\s','3*ds \t\n')結果['3', '*', 'd', 's']
'\a' 匹配字串開頭
'\z' 匹配字串結尾
'\b' 匹配單詞的詞首和詞尾,單詞被定義為乙個字母數字序列,因此詞尾是用空白符或非字母數字符來表示的
'\b' 與\b相反,只在當前位置不在單詞邊界時匹配
'(?p...)' 分組,除了原有編號外在指定乙個額外的別名 re.search("(?p[0-9])(?p[0-9])(?p[0-9])","371481199306143242").groupdict("city") 結果
是定義匹配的字元範圍。比如 [a-za-z0-9] 表示相應位置的字元要匹配英文本元和數字。[\s*]表示空格或者*號。
二.常用的re函式:
方法/屬性 作用
re.match(pattern, string, flags=0) 從字串的起始位置匹配,如果起始位置匹配不成功的話,match()就返回none
re.search(pattern, string, flags=0) 掃瞄整個字串並返回第乙個成功的匹配
re.findall(pattern, string, flags=0) 找到re匹配的所有字串,並把他們作為乙個列表返回
re.finditer(pattern, string, flags=0) 找到re匹配的所有字串,並把他們作為乙個迭代器返回
re.sub(pattern, repl, string, count=0, flags=0) 替換匹配到的字串
函式引數說明:
pattern:匹配的正規表示式
string:要匹配的字串
flags:標記為,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等。
repl:替換的字串,也可作為乙個函式
count:模式匹配後替換的最大次數,預設0表示替換所有匹配
例子1#!/usr/bin/python3
import re
#替換phone = '13617002575' #這是我的**號碼'
print('我的**號碼:',re.sub('#.*','',phone)) #去掉注釋
print(re.sub('\d','',phone))
#search
ip_addr = re.search('(\d\.)\d\.\d',os.popen('ifconfig').read())
print(ip_addr)
#match
>>> a = re.match('\d+','2ewrer666dad3123df45')
>>> print(a.group())
2獲取匹配的函式:
group(num=0) 匹配的整個表示式的字串,group() 可以一次輸入多個組號,在這種情況下它將返回乙個包含那些組所對應值的元組。
groups() 返回包含所有小組字串的元組,從1到所含的小組
groupdict() 返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典
start() 返回匹配開始的位置
end() 返回匹配結束的位置
span() 返回乙個元組包含匹配(開始,結束)的位置
三.原生字串,字元,分組
1.原生字串
每一次在匹配規則前面加了乙個r,表示不轉義,使用原生字串,沒用原始字串,也沒出現什麼問題。那是因為ascii 裡沒有對應的特殊字元,所以正規表示式編譯器能夠知道你指的是乙個十進位制數字。但是我們寫**本著嚴謹簡單的原理,最好是都寫成原生字串的格式。
import re
# 「\b」在ascii 字元中代表退格鍵,\b」在正規表示式中代表「匹配乙個單詞邊界」
print(re.findall("\bblow", "jason blow cat")) # 這裡\b代表退格鍵,所以沒有匹配到
print(re.findall("\\bblow", "jason blow cat")) # 用\轉義後這裡就匹配到了 ['blow']
print(re.findall(r"\bblow", "jason blow cat")) # 用原生字串後就不需要轉義了 ['blow']
#執行結果:
['blow']
['blow']
2.編譯
如果乙個匹配規則要多次使用,可以先將其編譯,以後就不用每次去重複寫匹配規則:
import re
comp = re.compile(r'\d')
print(comp.findall('abc1213,-45'))
#執行結果
['1', '2', '1', '3', '4', '5']
3.分組
re模組中分組的作用?
(1)判斷是否匹配(2)靈活提取匹配到各個分組的值。
>>> import re
>>> print(re.search(r'(\d+)-([a-z])','34324-dfsdfs777-hhh').group(0)) #返回整體
34324-d
>>> print(re.search(r'(\d+)-([a-z])','34324-dfsdfs777-hhh').group(1)) #返回第一組
34324
>>> print(re.search(r'(\d+)-([a-z])','34324-dfsdfs777-hhh').group(2)) #獲取第二組
d>>> print(re.search(r'(\d+)-([a-z])','34324-dfsdfs777-hhh').group(3)) #不存在。報錯「no such group」
traceback (most recent call last):
file "", line 1, in
indexerror: no such group
python3 常用模組 RE模組
一.常用正規表示式符號和語法 匹配所有字串,除 n以外 表示範圍 0 9 匹配前面的子表示式零次或多次。要匹配 字元,請使用 匹配前面的子表示式一次或多次。要匹配 字元,請使用 匹配字串開頭 匹配字串結尾 re 轉義字元,使後乙個字元改變原來的意思,如果字串中有字元 需要匹配,可以 或者字符集 re...
Python3基礎筆記 re模組
參考部落格 py西遊攻關之模組 就其本質而言,正規表示式 或 re 是一種小型的 高度專業化的程式語言,在python中 它內嵌在python中,並通過 re 模組實現。正規表示式模式被編譯成一系列的位元組碼,然後由用 c 編寫的匹配引擎執行。importre 萬用字元,乙個 模糊匹配乙個除換行符之...
Python常用模組 re
python內部的re 傳聞中的正則模組,是無數初學者心中的噩夢,幾乎到了談正則色變的地步。1.正則是幹什麼的 正規表示式,又稱規則表示式。英語 regular expression,在 中常簡寫為regex regexp或re 電腦科學的乙個概念。正規表示式通常被用來檢索 替換那些符合某個模式 規...