簡介
筆者的正則的學習筆記和思維導圖
用處
- 字符串匹配
- 字符串查找
- IDE集成
如何學習
- 分類別記憶
- 多練習,無他,唯手熟爾。
- 潛龍勿用

1. 正則元字符
何為元字符,就是有特殊意義的字符比如\d, \w,可以分為
特殊單字符
a. \d 任意數(shù)字, \D 任意非數(shù)字
b. \w 任意字母數(shù)字下劃線, \W 任意非字母數(shù)字下劃線
c. \s 任意空白符, **\S ** 任意非空白符
d. . 任意字符(換行符除外)空白字符
a. \r 回車
b. \n 換行
c. \f 換頁符
d. \t 制表符
e. \v 垂直制表符量詞
a. * 0到多次
b. + 1到多次
c. ? 0到1次
d. {m} 出現(xiàn)m次
e. {m,} 出現(xiàn)至少m次
f. {m, n} M到N次范圍處理
a. | 如ab|ac 代表ab或者ac.
b. [……]多選一,任意單個元素,注意[1,2]代表1 , 2三個元素但是[^1]代表非1
c. [a-z] 匹配a到Z之間的任意單個字符。常用的[a-zA-Z0-9]
2. 正則匹配模式
- 貪婪匹配
import re
re.findall(r'a*', 'aaabbb')
['aaa', '', '', '', '']
默認是貪婪模式,盡可能多的去匹配字符串
- 非貪婪匹配
import re
re.findall(r'a*?', 'aaabbb')
['', 'a', '', 'a', '', 'a', '', '', '', '']
加 ? 代表非貪婪匹配,盡可能少的匹配字符串
- 獨占模式
無論是貪婪模式還是非貪婪模式,都需要回溯才能完成相應功能。還有一種不需要回溯,叫獨占模式,準確的形容為,不會交還已經匹配上的字符。
獨占模式具體的方法就是在量詞后加上加號(+)。
什么是回溯呢
Exp:
pip install regex
ipython
import regex
regex.findall(r'a{1,3}abb', 'aaabb')
['aaabb']
regex.findall(r'a{1,3}+abb', 'aaabb')
Out[8]: []
regex.findall(r'a{1,3}?abb', 'aaabb')
Out[9]: ['aaabb']
貪婪模式下,會盡可能的多的匹配總費用,匹配第四個b時,碰到了c字符,需要回溯到前一個上在做c字符匹配。如果發(fā)生回溯,則可以匹配,如果不回溯,在獨占模式下,則不匹配。
3. 分組與編號
正則表達式中()代表一個組。
Exp: 匹配重復字符串
text='man man , what`s the fuck fuck!'
rexp=r'(\w+)(\s+\1)+'
re.findall(rexp, text)
[('man', ' man'), ('fuck', ' fuck')]
正則表達式中 \1 就是前邊 (\w+) 的值。
那么多個括號嵌套怎么算?
從第一個( 算起,編號從1到n,如果不想被引用,怎么辦?
加入 ?:
rexp=r'(\w+)(?:\s+\1)(\2)'
這里(\2)不會生效。
這個功能設計看起來花里胡哨,如何落地使用呢??最簡單的就是字符串替換
>>> import re
>>> test_str = "2020-05-10 20:23:05"
>>> regex = r"((\d{4})-(\d{2})-(\d{2})) ((\d{2}):(\d{2}):(\d{2}))"
>>> subst = r"日期\1 時間\5 \2年\3月\4日 \6時\7分\8秒"
>>> re.sub(regex, subst, test_str)
'日期2020-05-10 時間20:23:05 2020年05月10日 20時23分05秒'
4. 匹配模式
- 不區(qū)分大小寫
>>> import re
>>> re.findall(r"cat", "CAT Cat cat", re.IGNORECASE)
['CAT', 'Cat', 'cat']
a. 不區(qū)分大小寫模式的指定方式,使用模式修飾符 (?i)
b. 修飾符如果在括號內,作用范圍是這個括號內的正則,而不是整個正則;
c. 使用編程語言時可以使用預定義好的常量來指定匹配模式。
-
. 通配模式
匹配任意字符可以用 [\s\S], [\d\D], [\w\W] 但是比較麻煩
可以設置點號通配符
(?s).
多行模式
(?m)
正則中還有 \A 和 \z(Python 中是 \Z) 這兩個元字符容易混淆,\A 僅匹配整個字符串的開始,\z 僅匹配整個字符串的結束,在多行匹配模式下,它們的匹配行為不會改變,如果只想匹配整個字符串,而不是匹配每一行,用這個更嚴謹一些注釋模式
(?#comment)
5. 斷言
- 單詞邊界
- 行的開始/結束
- 環(huán)視
6.轉義字符
這里什么好說的,需要注意編程語言自身會做轉義字符處理,正則還要做轉義字符處理,有時候會是4個\
7. 歷史
- POSIX
- PCRE
8 拓展
筆者認為:正則表達式是一種圖靈不完備的編程范式,每種語言go、python、 java、js都有各自的實現(xiàn)與支持的規(guī)范。
但是正則表達式包含了常見語言的三要素:
- 順序
- 分支 a|b
- 循環(huán) *, +, {m, n}
甚至還有作用域()
結束語
持續(xù)學習和輸出會讓你更快樂