正則表達式,Regular Expression ,縮寫爲regex regexp、RE等python
在編程中,最常打交道的就是字符串,處理最多的就是字符串,正則表達式
正則表達式是文本處理領域最經常使用的技術,對字符串按照某種規則檢索,或者替換字符串編程
分類:vim
BRE :基本的正則表達式,grep、sed、vi等軟件支持,vim有擴展socket
ERE : 擴展的正則表達式,egrep(rgrep-E),sed-r等code
PCRE : (Perl Compatible Regular Expressions),幾乎全部語言都是PCRE的方言或變種,Python從1.6開始使用SRE正則表達式引擎,能夠理解爲PCRE的子集,見模塊re。regexp
基本語法ip
元字符 metacharacter字符串
.點,匹配除換行符外的任意一個字符,在Windows下回車換行是兩個\r\n,有時正則表達式會留下一個回車,處理時要注意it
[abc] 匹配一個字符,包含在集合中的任意一個字符,[abc]匹配plain中的a
[^abc]除abc外的一個字符,只匹配一個,匹配plain中的'p','l','i','n'
[a-z] 字符範圍,也是一個集合,只匹配一個字符
[^a-z] 字符範圍,也是一個集合,只匹配一個字符,除其中的字符
\b 匹配單詞的邊界,\bb表示在文本找到b開頭的單詞,b\b爲以b結尾的
\B 匹配不是字符的邊界的字符,
\d 匹配[0-9]中的一位
\D 匹配一位非數字
\s 匹配一位空字符
\S 匹配一位非空白字符
\w 匹配[a-zA-Z0-9_],包括中文的字,不匹配符號,支持uncode字符,匹配時注意行尾的回車換行,
\W 一位非文字
\\,\n,\r 原意,加轉義符來表達原意
多位匹配貪婪模式,匹配找到的最長的字符
* 屢次匹配,零或者以上任意次 ,使用.*是注意範圍,模式會影響找到的內容,單行模式有可能找到的並非你要的,
+ 至少一個,{1,}
? 有無{0,1}
{n} 固定重複次數
{n,} 重複n次及以上
{0,} 至關於*,{1,}至關於+
{n,m} {0,1} n要小於m
x|y 匹配 x或者y 注意w|food 和(w|f)ood 的區別,前者會找到w,food
() 分組,或者捕獲,使用捕獲後會自動分配組號,從1開始,能夠改變優先級,匹配帶來分組,沒有匹配到就不會有分組
(very)\s+\1 引用分組號\1, \s+表示中間空白字符一個以上
(?:w|f)ood 表示括號改變優先級,不分組
((?:w|f)ood) 表示分組組名food,wood
(?:<name>exp) python中使用(?P<head>w|f)ood 命名分組
零寬斷言
斷言不是分組
f(?=ood) (?:=)斷言只是條件,不參與匹配,匹配f,ood是條件
(?<=f)ood 匹配ood,f只是條件
負向零寬斷言
(?!) 斷言f(?!ood)f後必定不是ood,
(?<!)
(?#commend) 註釋,少用。寫在表達式先後
分組和捕獲意思相同
使用時,能用簡單就不用複雜
貪婪和非貪婪,
捕獲的內容或匹配的內容不一樣
(.*?) 找到的內容,非貪婪
*? 匹配任意次,儘量少
??
+?
{2,}? 至關於{2}
?? 和*? 單獨使用沒有意義,找啥?
加在重複的選項上
引擎的選項
ignoreCase 忽略大小寫
Singleline
Mulitline
單行模式能夠突破換行符,控制的是換行符,控制的是點可否匹配到換行符
. 點能夠匹配包括換行符的字符
^ $ 表示整個字符串的開頭和結尾
多行模式
. 匹配除換行符外的全部字符
^$ 控制行首行尾,多行匹配行首尾
結尾註意\n\r 加\r?,win下有問題
socket 庫,篩選ip地址
從分組組名中提取數據
分隔符取反
你想要的數據中(最不可能出現的值能夠做爲你取反的值)來求你要的值
取1-999的數字
[1-9]\d|[1-9]\d|\d
[1-9]?\d\d?
\b(?!0)\d{1,3}\b
25[0-5]|2[0-4]2[0-4]|1\d{0,2}|0