正則表達式學習筆記

簡介

筆者的正則的學習筆記和思維導圖

用處

  1. 字符串匹配
  2. 字符串查找
  3. IDE集成

如何學習

  1. 分類別記憶
  2. 多練習,無他,唯手熟爾。
  3. 潛龍勿用
正則表達式.png

1. 正則元字符

何為元字符,就是有特殊意義的字符比如\d, \w,可以分為

  1. 特殊單字符
    a. \d 任意數(shù)字, \D 任意非數(shù)字
    b. \w 任意字母數(shù)字下劃線, \W 任意非字母數(shù)字下劃線
    c. \s 任意空白符, **\S ** 任意非空白符
    d. . 任意字符(換行符除外)

  2. 空白字符
    a. \r 回車
    b. \n 換行
    c. \f 換頁符
    d. \t 制表符
    e. \v 垂直制表符

  3. 量詞
    a. * 0到多次
    b. + 1到多次
    c. ? 0到1次
    d. {m} 出現(xiàn)m次
    e. {m,} 出現(xiàn)至少m次
    f. {m, n} M到N次

  4. 范圍處理
    a. | 如ab|ac 代表ab或者ac.
    b. [……]多選一,任意單個元素,注意[1,2]代表1 , 2三個元素但是[^1]代表非1
    c. [a-z] 匹配a到Z之間的任意單個字符。常用的[a-zA-Z0-9]

2. 正則匹配模式

  1. 貪婪匹配
import re
re.findall(r'a*', 'aaabbb')
['aaa', '', '', '', '']

默認是貪婪模式,盡可能多的去匹配字符串

  1. 非貪婪匹配
import re
re.findall(r'a*?', 'aaabbb')
['', 'a', '', 'a', '', 'a', '', '', '', '']

? 代表非貪婪匹配,盡可能少的匹配字符串

  1. 獨占模式
    無論是貪婪模式還是非貪婪模式,都需要回溯才能完成相應功能。還有一種不需要回溯,叫獨占模式,準確的形容為,不會交還已經匹配上的字符。
    獨占模式具體的方法就是在量詞后加上加號(+)。
    什么是回溯呢
    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. 匹配模式

  1. 不區(qū)分大小寫
>>> import re
>>> re.findall(r"cat", "CAT Cat cat", re.IGNORECASE)
['CAT', 'Cat', 'cat']

a. 不區(qū)分大小寫模式的指定方式,使用模式修飾符 (?i)
b. 修飾符如果在括號內,作用范圍是這個括號內的正則,而不是整個正則;
c. 使用編程語言時可以使用預定義好的常量來指定匹配模式。

  1. . 通配模式
    匹配任意字符可以用 [\s\S], [\d\D], [\w\W] 但是比較麻煩
    可以設置點號通配符
(?s).
  1. 多行模式
    (?m)
    正則中還有 \A 和 \z(Python 中是 \Z) 這兩個元字符容易混淆,\A 僅匹配整個字符串的開始,\z 僅匹配整個字符串的結束,在多行匹配模式下,它們的匹配行為不會改變,如果只想匹配整個字符串,而不是匹配每一行,用這個更嚴謹一些

  2. 注釋模式
    (?#comment)

5. 斷言

  1. 單詞邊界
  2. 行的開始/結束
  3. 環(huán)視

6.轉義字符

這里什么好說的,需要注意編程語言自身會做轉義字符處理,正則還要做轉義字符處理,有時候會是4個\

7. 歷史

  1. POSIX
  2. PCRE

8 拓展

筆者認為:正則表達式是一種圖靈不完備的編程范式,每種語言go、python、 java、js都有各自的實現(xiàn)與支持的規(guī)范。
但是正則表達式包含了常見語言的三要素:

  1. 順序
  2. 分支 a|b
  3. 循環(huán) *, +, {m, n}

甚至還有作用域()

結束語

持續(xù)學習和輸出會讓你更快樂

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容