关于正则表达式,我所知道的都在这里
一、寫(xiě)在前面
二、語(yǔ)法
1. 匹配單個(gè)字符
2. 匹配一組字符
3. 使用元字符
4. 重復(fù)匹配
5. 位置匹配
6. 子表達(dá)式
7. 回溯引用(前后一致匹配)
8. 前后查找
三、在 Python 中使用
1. re 庫(kù)
2. pandas 庫(kù)
一、寫(xiě)在前面
在學(xué)習(xí)和使用正則表達(dá)式的時(shí)候,重要的并不是知道多少個(gè)特殊字符,而是會(huì)不會(huì)運(yùn)用它們?nèi)ソ鉀Q實(shí)際問(wèn)題
「基本用途:搜索和替換」
正則表達(dá)式是一些用來(lái)匹配和處理文本的字符串
語(yǔ)法是正則表達(dá)式最容易掌握的部分,真正的挑戰(zhàn)是學(xué)會(huì)如何運(yùn)用語(yǔ)法把實(shí)際問(wèn)題分解為一系列正則表達(dá)式并最終解決
在編寫(xiě)正則表達(dá)式的時(shí)候,同一個(gè)問(wèn)題往往會(huì)有多種解決方案
驗(yàn)證某個(gè)模式能不能獲得預(yù)期的匹配結(jié)果并不困難,但如何驗(yàn)證它不會(huì)匹配到不想到的東西可就沒(méi)那么簡(jiǎn)單了
「正則表達(dá)式在線(xiàn)測(cè)試網(wǎng)頁(yè)」
「https://c.runoob.com/front-end/854/」
?網(wǎng)站界面二、語(yǔ)法
1. 匹配單個(gè)字符
正則表達(dá)式是區(qū)分字母大小寫(xiě)的
如果要忽略值的大小寫(xiě),需要使用 re.I
. 可以匹配任何一個(gè)字符、字母、數(shù)字、甚至是 . 本身
在同一個(gè)正則表達(dá)式里允許使用多個(gè) . 字符,既可以連續(xù)出現(xiàn),也可以間隔出現(xiàn)在模式的不同位置
使用 \ 對(duì)特殊字符(元字符)進(jìn)行轉(zhuǎn)義,\ 本身也是一個(gè)元字符
2. 匹配一組字符
使用 [] 定義字符集合
在定義一個(gè)字符區(qū)間的時(shí)候,一定要避免讓這個(gè)區(qū)間的尾字符小于它的首字符(根據(jù) ASCII 字符的大小)
在字符集合以外的地方,- 只是一個(gè)普通字符,只能與 - 本身相匹配,- 字符不需要做轉(zhuǎn)義
^ 對(duì)一個(gè)字符集合進(jìn)行取非匹配
^ ?作用于給定字符集合里的所有字符和字符區(qū)間,而不是僅限于緊跟在 ^ 后面的那一個(gè)字符或字符區(qū)間
3. 使用元字符
| [\b] | 回退(刪除)一個(gè)字符 |
| \f | 換頁(yè)符 |
| 「\n」 | 「換行符」 |
| 「\r」 | 「回車(chē)符」 |
| 「\t」 | 「制表符」 |
| \v | 垂直制表符 |
| 「\d」 | 「任何一個(gè)數(shù)字字符,等價(jià)于[0-9]」 |
| 「\D」 | 「任何一個(gè)非數(shù)字字符」 |
| 「\w」 | 「等價(jià)于[a-zA-Z0-9_]」 |
| 「\W」 | 「任何一個(gè)非字母數(shù)字或非下劃線(xiàn)字符」 |
| 「\s」 | 「等價(jià)于[\f\n\r\t\v]」 |
| 「\S」 | 「任何一個(gè)非空白字符」 |
| \E | 結(jié)束 \L 或 \U 轉(zhuǎn)換 |
| \l | 把下一個(gè)字符轉(zhuǎn)換為小寫(xiě) |
| \L | 把 \L 到 \E 之間的字符全部轉(zhuǎn)換為小寫(xiě) |
| \u | 把下一個(gè)字符轉(zhuǎn)換為大寫(xiě) |
| \U | 把 \U 到 \E 之間的字符全部轉(zhuǎn)換為大寫(xiě) |
| 「(?=)」 | 「正向前查找」 |
| 「(?!)」 | 「負(fù)向前查找」 |
| 「(?<=)」 | 「正向后查找」 |
| 「(?<!)」 | 「負(fù)向后查找」 |
| (?m) | 分行模式匹配 |
\r\n 是 Windows 所使用的文本行結(jié)束標(biāo)簽
在 Linux 上匹配空白行只使用 \n\n 即可
同時(shí)適用于 Windows 和 Linux 的正則表達(dá)式應(yīng)該包含一個(gè)可選的 \r 和一個(gè)必須被匹配的 \n
十六進(jìn)制(逢16進(jìn)1)數(shù)值要用前綴 \x 來(lái)給出
八進(jìn)制(逢8進(jìn)1)數(shù)值要用前綴 \0 來(lái)給出
| 表示邏輯 或 操作符
4. 重復(fù)匹配
+ 匹配一個(gè)或多個(gè)字符(或字符集合)
* 匹配零個(gè)或多個(gè)字符(或字符集合)
? 匹配零個(gè)或一個(gè)字符(或字符集合)
如果打算同時(shí)使用 [] 和 ? ,千萬(wàn)記得應(yīng)該把 ? 放在字符集合的外面
重復(fù)次數(shù)要用 {} 來(lái)給出,把數(shù)值寫(xiě)在里面,重復(fù)的次數(shù)可以是0
{m,n} 為匹配次數(shù)設(shè)定一個(gè)最小值和最大值
{m,} 為匹配次數(shù)設(shè)定一個(gè)最小值
{,n} 為匹配次數(shù)設(shè)定一個(gè)最大值
懶惰型元字符的寫(xiě)法,只要給貪婪型元字符加上一個(gè) ? 后綴即可
5. 位置匹配
位置匹配解決在什么地方進(jìn)行字符串匹配操作的問(wèn)題
由限定符 \b 指定單詞的邊界,用來(lái)匹配一個(gè)單詞的開(kāi)頭和結(jié)尾
\b 匹配且只匹配一個(gè)位置,不匹配任何字符
想表明不匹配一個(gè)單詞邊界,使用 \B
^ 定義字符串開(kāi)頭,$ 定義字符串結(jié)尾
^\s* 匹配一個(gè)字符串的開(kāi)頭位置和隨后的零個(gè)或多個(gè)空白字符
\s*$ 匹配一個(gè)字符串的結(jié)尾位置零個(gè)或多個(gè)空白字符
如果要使用分行匹配模式,需要使用 re.S
6. 子表達(dá)式
使用 () 來(lái)把子表達(dá)式當(dāng)做一個(gè)獨(dú)立元素
子表達(dá)式允許多重嵌套,但在實(shí)際工作中一個(gè)遵循適可而止的原則
絕大多數(shù)嵌套子表達(dá)式都沒(méi)有看上去那么復(fù)雜
把必須匹配的情況考慮周全并寫(xiě)出一個(gè)匹配結(jié)果符合預(yù)期的正則表達(dá)式很容易,但把不需要匹配的情況也考慮周全并確保它們都將被排除在匹配結(jié)果之外往往要困難得多
7. 回溯引用(前后一致匹配)
回溯引用允許正則表達(dá)式模式引用前面的匹配結(jié)果
回溯引用指的是模式的后半部分引用在前半部分中定義的子表達(dá)式
可以把回溯引用想象成變量
Java 和 Python 將返回一個(gè)包含 group 的數(shù)組匹配對(duì)象
回溯引用只能用來(lái)引用模式里的子表達(dá)式
回溯引用匹配通常從 1 開(kāi)始計(jì)數(shù)(\1)
如果子表達(dá)式的相對(duì)位置發(fā)生了變化,整個(gè)模式也許就不能再完成原來(lái)的工作
「查找時(shí),使用 \n ;替換時(shí),使用$n」
在對(duì)文本進(jìn)行重新排版時(shí),把文本分解成多個(gè)子表達(dá)式的做法往往非常有用,可以對(duì)文本的排版效果做出更精準(zhǔn)的控制
需要用到 re.finditer(pattern,string,flags)
8. 前后查找
在同一個(gè)搜索模式里可以使用多個(gè)前后查找表達(dá)式
向前查找指定了一個(gè)必須匹配但不在結(jié)果中返回的模式,實(shí)際就是一個(gè)以 ?= 開(kāi)頭的子表達(dá)式
向后查找指定了一個(gè)必須匹配但不在結(jié)果中返回的模式,實(shí)際就是一個(gè)以 ?<= 結(jié)尾的子表達(dá)式
向前查找模式的長(zhǎng)度是可變的,可以包含 \ 和 + 之類(lèi)的元字符;向后查找模式只能是固定長(zhǎng)度
前后查找必須用 ! 替換掉 = 來(lái)取非
三、在 Python 中使用
1. re 庫(kù)
(1)re.findall(pattern,string,flags)
返回的結(jié)果是列表,如果沒(méi)有匹配到結(jié)果,返回空列表
(2)re.search(pattern,string,flags)
要得到匹配結(jié)果,需要通過(guò) group() 方法獲取值,如果沒(méi)有匹配到結(jié)果,返回 None
只有在 group() 的參數(shù)為 1 時(shí),才會(huì)返回子表達(dá)式中的結(jié)果
group() 的參數(shù)最大不能超過(guò)正則表達(dá)式里子表達(dá)式的個(gè)數(shù)
(3)re.sub(pattern,replace,string,count) / re.subn(pattern,replace,string,count)
可以指定替換次數(shù),不指定則默認(rèn)替換全部
(4) re.finditer(pattern,string,flags)
import?refor?item?in?re.finditer('\d+','我的名字是張三,工號(hào)是110110,職業(yè)是法外狂徒;他的名字是李四,工號(hào)是120120,職業(yè)是醫(yī)生'):print(item.group())#?110110 #?120120(5)re.split(pattern,string,maxsplit)
返回字符串被分割后的列表,可以指定最大分割次數(shù),不指定則全部分割
2. pandas 庫(kù)
構(gòu)造數(shù)據(jù)
自定義函數(shù)
Series.str.findall(pattern, flags)
Series.str.contains(pattern,regex=True,flags)
Series.str.replace(pattern,replace)
Series.str.extract(pattern, flags,expand) / Series.str.extractall(pattern, flags)
Series.str.match(pattern, flags).str[0]
對(duì)比Excel系列圖書(shū)累積銷(xiāo)量達(dá)15w冊(cè),讓你輕松掌握數(shù)據(jù)分析技能,感興趣的同學(xué)可以直接在各大電商平臺(tái)搜索書(shū)名了解:
總結(jié)
以上是生活随笔為你收集整理的关于正则表达式,我所知道的都在这里的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 明朝有勇有谋的将领
- 下一篇: 18 个常犯的统计学错误,建议收藏!