Python入门:正则表达式
正則表達式是對字符串操作的一種邏輯公式,用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯
正則表達式是一種文本模式,模式描述在搜索文本時要匹配的一個或多個字符串
一、常用操作符
正則表達式中的常用操作符如下
| . | 表示單個字符 | |
| [ ] | 字符集,對單個字符給出取值范圍 | [abc] 表示a、b、c;[a-z] 表示a到z的任意單個字符 |
| [^ ] | 給字符集,對單個字符串給出排除范圍 | [^abc] 表示非a、b、c的任意單個字符 |
| * | 前一個字符0次或無限次擴展 | abc* 表示ab、abc、abcc… |
| + | 前一個字符1次或無限次擴展 | abc+ 表示abc、abcc、abccc… |
| ? | 前一個字符0次或一次擴展 | abc? 表示ab、abc |
| | | 左右表達式中的任意一個 | abc|def 表示abc或def |
| {m} | 擴展前一個字符m次 | ab{2}c 表示abbc |
| {m, n} | 擴展前一個字符m到n次,包括n次 | ab{1,2}c 表示abc、abbc |
| ^ | 匹配字符串開頭 | ^abc 表示以字符串a(chǎn)bc開頭 |
| $ | 匹配字符串結(jié)尾 | |
| () | 分組標記,內(nèi)部使用 | 操作符 | (abc|def )表示abc或def |
| \d | 數(shù)字符號,等價于[0-9] | |
| \w | 等價于[A-Za-z0-9] |
二、正則表達式的類型
raw string (原生字符串類型):不包含轉(zhuǎn)義字符的字符串,表示形式為r'text'
string(字符串類型):包含轉(zhuǎn)義字符的字符串
比如匹配數(shù)字符號,使用原生子串的形式表示為 r'\d',使用字符串類型表示的話,因為 \ 是特殊字符,因此需要進行轉(zhuǎn)義,表示為 '\\d'。由此可見使用原生字符串類型要相對簡單一些
三、Re庫常用的方法
Python 中通過 Re 庫提供對正則表達式的支持,下面主要介紹一下 Re 庫中主要使用的函數(shù)
1.re.search(pattern, string, flags):在一個字符串中搜索匹配正則表達式的第一個子串,返回 Match 對象
- pattern:正則表達式的字符串或原生字符串的表示
- string:待匹配的字符串
flags:正責表達式使用時的控制標記,這個參數(shù)是可變的
flags 常用的標記:
- re.I(re.IGNORECASE):忽略正則表達式的大小寫
- re.M(re.MULTILINE):正則表達式中的 ^ 操作符將給定的字符串的每行當做匹配的開始
- re.S(re.DOTALL):. 操作符能夠匹配所有字符,默認匹配除換行的所有字符
舉例
import re# 用于匹配連續(xù)的 5 個數(shù)字 match = re.search(r'\d{5}', 'f123456g654321')if match:print(match.group(0))# 123452.re.match(pattern, string, flags):從一個字符串的開始位置起匹配正則表達式,返回 Match 對象
舉例1
import re# 從字符串開始問看看匹配符合條件的 5 個連續(xù)的數(shù)字 match = re.match(r'\d{5}', 'f123456g654321') if match:print(match.group(0))# 輸出空,沒有符合條件的字符串舉例2
import rematch = re.match(r'\d{5}', '123456g654321') if match:print(match.group(0))# 123453.re.findall(pattern, string, flags):搜索字符串,返回一個符合條件的所有子串的集合
舉例
import rels = re.findall(r'\d{5}', '123456g654321') print(ls)# ['12345', '65432']4.re.split(pattern, string, maxsplit,flags):將一個字符串按照正則表達式匹配的結(jié)果進行分割,返回列表類型
- maxsplit:表示最大的分割數(shù)
舉例
import rels = re.split(r'[a-z]', '123a45b6', maxsplit=1) print(ls)# ['123', '45b6'] -> 后面的字符串不進行分割而是整個返回5.re.finditer(pattern, string, maxsplit,flags):搜索字符串,返回一個符合結(jié)果的迭代類型,每個迭代元素是 match 對象
舉例
import rem = re.finditer(r'\d{5}', '123456g654321') for i in m:print(i.group(0))# 12345 # 654326.re.sub(pattern, replace, string, maxsplit,count, flags):使用一個新的子串替換所有正則表達式匹配的子串,返回替換后的字符串
- replace:替換符合正則表達式的新子串
- 最大替換次數(shù)
舉例
import renew_str = re.sub(r'\d{5}', 'jas', '123456|654321') print(new_str)# jas6|jas1PS:上面的所有例子我們使用的都是 Re 庫的函數(shù)式用法,這種函數(shù)式用法支持一次性的操作,Re 庫還提供了一種面向?qū)ο蟮挠梅?#xff0c;這種用法支持編譯后多次操作。使用方法如下
import reregex= re.compile(r'\d{5}') new_str = re.sub(regex, 'jas', '123456|654321')print(new_str)上面 regex= re.compile(r'\d{5}') 用于將正則表達式的字符串形式編譯成正則表達式對象, 可以幫助我們更好理解正則表達式
四、Match對象
上面有兩個方法 re.match(pattern, string, flags) 、re.search(pattern, string, flags) 返回的是一個 Match 對象,這個 Match 對象是什么呢?下面來介紹一下
Match 對象中的屬性
- string:帶匹配的字符串
- re:匹配時使用的 pattern 對象(正則表達式)
- pos:正則表達式搜索文本的開始位置
- endpos:正則表達式搜索文本的結(jié)束位置
Match 對象中的方法
- group(0):返回匹配后的字符串
- start():匹配字符串在原始字符串中的起始位置
- end():匹配字符串在原始字符串中的結(jié)束位置
- span():匹配字符串在原始字符串中的返回起始與結(jié)束位置
例子
import repattern = re.compile(r'\d{5}') match = re.search(pattern, 'f123456g654321')print(match.re) print(match.span())# re.compile('\\d{5}') # (1, 6)五、貪婪匹配與最小匹配
我們通過例子來理解什么是貪婪匹配與最小匹配
import re# '*' 表示匹配前面任意字符且任意個數(shù) pattern = re.compile(r'p.*') match = re.search(pattern, 'pfds45')if match:print(match.group(0))# pfds45上面這種方式是貪婪匹配,也是 python 默認的匹配方式
import re# '*?' 前一個字符 0 次或無限次擴展 pattern = re.compile(r'p.*?') match = re.search(pattern, 'pfds45')if match:print(match.group(0))# p上面這種匹配的方式稱為最小匹配,因為是最小匹配因此返回匹配的結(jié)果是最小的
最小匹配操作符
- *?:前一個字符 0 次或無限次匹配
- +?:前一個字符 1 次或無限次擴展
- ??:前一個字符 0 次或 1 次擴展
- {m, n}?:擴展前一個字符 m 次至 n 次
總結(jié)
以上是生活随笔為你收集整理的Python入门:正则表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java web 面试题
- 下一篇: 鸳鸯锅为什么辣锅先沸腾?