python3 常用模組 RE模組

2021-08-19 14:04:14 字數 3842 閱讀 9231

一.常用正規表示式符號和語法:

'.' 匹配所有字串,除\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 電腦科學的乙個概念。正規表示式通常被用來檢索 替換那些符合某個模式 規...