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