一篇搞定Python正則表達式

1. 正則表達式語法html

1.1 字符與字符類
    1 特殊字符:.^$?+*{}[]()|
      以上特殊字符要想使用字面值,必須使用進行轉義
    2 字符類
      1. 包含在[]中的一個或者多個字符被稱爲字符類,字符類在匹配時若是沒有指定量詞則只會匹配其中的一個。
      2. 字符類內能夠指定範圍,好比[a-zA-Z0-9]表示a到z,A到Z,0到9之間的任何一個字符
      3. 左方括號後跟隨一個^,表示否認一個字符類,好比[^0-9]表示能夠匹配一個任意非數字的字符。
      4. 字符類內部,除了以外,其餘特殊字符再也不具有特殊意義,都表示字面值。^放在第一個位置表示否認,放在其餘位置表示^自己,-放在中間表示範圍,放在字符類中的第一個字符,則表示-自己。正則表達式

      5. 字符類內部可使用速記法,好比d s w
    3 速記法
      . 能夠匹配除換行符以外的任何字符,若是有re.DOTALL標誌,則匹配任意字符包括換行
      d匹配一個Unicode數字,若是帶re.ASCII,則匹配0-9
      D 匹配Unicode非數字
      s匹配Unicode空白,若是帶有re.ASCII,則匹配 中的一個
      S 匹配Unicode非空白
      w匹配Unicode單詞字符,若是帶有re.ascii,則匹配[a-zA-Z0-9_]中的一個
      W 匹配Unicode非單子字符app

1.2 量詞
    1. ?匹配前面的字符0次或1次
    2. *匹配前面的字符0次或屢次
    3. +匹配前面的字符1次或者屢次
    4. {m}匹配前面表達式m次
    5. {m,}匹配前面表達式至少m次
    6. {,n}匹配前面的正則表達式最多n次
    7. {m,n}匹配前面的正則表達式至少m次,最多n次
    注意點:
      以上量詞都是貪婪模式,會盡量多的匹配,若是要改成非貪婪模式,經過在量詞後面跟隨一個?來實現ide

1.3 組與捕獲
    1 ()的做用:
      1. 捕獲()中正則表達式的內容以備進一步利用處理,能夠經過在左括號後面跟隨?:來關閉這個括號的捕獲功能
      2. 將正則表達式的一部份內容進行組合,以便使用量詞或者|
    2 反響引用前面()內捕獲的內容:
      1. 經過組號反向引用
        每個沒有使用?:的小括號都會分配一個組好,從1開始,從左到右遞增,能夠經過i引用前面()內表達式捕獲的內容
      2. 經過組名反向引用前面小括號內捕獲的內容
        能夠經過在左括號後面跟隨?P<name>,尖括號中放入組名來爲一個組起一個別名,後面經過(?P=name)來引用 前面捕獲的內容。如(? P<word>w+)s+(?P=word)來匹配重複的單詞。
    3 注意點:
      反向引用不能放在字符類[]中使用。函數

1.4 斷言與標記
    斷言不會匹配任何文本,只是對斷言所在的文本施加某些約束
    1 經常使用斷言:
      1. 匹配單詞的邊界,放在字符類[]中則表示backspace
      2. B 匹配非單詞邊界,受ASCII標記影響
      3. A 在起始處匹配
      4. ^在起始處匹配,若是有MULTILINE標誌,則在每一個換行符後匹配
      5. Z 在結尾處匹配
      6. $在結尾處匹配,若是有MULTILINE標誌,則在每一個換行符前匹配
      7. (?=e)正前瞻
      8. (?!e)負前瞻
      9. (?<=e)正回顧
      10.(?<!e)負回顧
    2 前瞻回顧的解釋
      前瞻: exp1(?=exp2) exp1後面的內容要匹配exp2
      負前瞻: exp1(?!exp2) exp1後面的內容不能匹配exp2
      後顧: (?<=exp2)exp1 exp1前面的內容要匹配exp2
      負後顧: (?<!exp2)exp1 exp1前面的內容不能匹配exp2
      例如:咱們要查找hello,可是hello後面必須是world,正則表達式能夠這樣寫:"(hello)s+(?=world)",用來匹配"hello wangxing"和"hello world"只能匹配到後者的hellospa

1.5 條件匹配
    (?(id)yes_exp|no_exp):對應id的子表達式若是匹配到內容,則這裏匹配yes_exp,不然匹配no_expcode

1.6 正則表達式的標誌
    1. 正則表達式的標誌有兩種使用方法
      1. 經過給compile方法傳入標誌參數,多個標誌使用|分割的方法,如re.compile(r"#[da-f]{6}", re.IGNORECASE|re.MULTILINE)
      2. 經過在正則表達式前面添加(?標誌)的方法給正則表達式添加標誌,如(?ms)#[da-z]{6}
    2. 經常使用的標誌
      re.A或者re.ASCII, 使 B s S w W d D都假定字符串爲假定字符串爲ASCII
      re.I或者re.IGNORECASE使正則表達式忽略大小寫
      re.M或者re.MULTILINE 多行匹配,使每一個^在每一個回車後,每一個$在每一個回車前匹配
      re.S或者re.DOTALL 使.能匹配任意字符,包括回車
      re.X或者re.VERBOSE 這樣能夠在正則表達式跨越多行,也能夠添加註釋,可是空白鬚要使用s或者[ ]來表示,由於默認的空白再也不解釋。如:
        re.compile(r"""
          <imgs +)#標籤的開始
          [^>]*?#不是src的屬性
          src=#src屬性的開始
          (?:
          (?P<quote>["'])#左引號
          (?P<image_name>[^>]+?)#圖片名字
          (?P=quote)#右括號
          """,re.VERBOSE|re.IGNORECASE)orm

2. Python正則表達式模塊
 2.1 正則表達式處理字符串主要有四大功能
    1. 匹配 查看一個字符串是否符合正則表達式的語法,通常返回true或者false
    2. 獲取正則表達式來提取字符串中符合要求的文本
    3. 替換查找字符串中符合正則表達式的文本,並用相應的字符串替換
    4. 分割使用正則表達式對字符串進行分割。
2.2 Python中re模塊使用正則表達式的兩種方法
    1. 使用re.compile(r, f)方法生成正則表達式對象,而後調用正則表達式對象的相應方法。這種作法的好處是生成正則對象以後能夠屢次使用。
    2. re模塊中對正則表達式對象的每一個對象方法都有一個對應的模塊方法,惟一不一樣的是傳入的第一個參數是正則表達式字符串。此種方法適合於只使用一次的正則表達式。
2.3 正則表達式對象的經常使用方法
    1. rx.findall(s,start, end):
      返回一個列表,若是正則表達式中沒有分組,則列表中包含的是全部匹配的內容,
      若是正則表達式中有分組,則列表中的每一個元素是一個元組,元組中包含子分組中匹配到的內容,可是沒有返回整個正則表達式匹配的內容
    2. rx.finditer(s, start, end):
      返回一個可迭代對象
      對可迭代對象進行迭代,每一次返回一個匹配對象,能夠調用匹配對象的group()方法查看指定組匹配到的內容,0表示整個正則表達式匹配到的內容
    3. rx.search(s, start, end):
      返回一個匹配對象,假若沒匹配到,就返回None
      search方法只匹配一次就中止,不會繼續日後匹配
    4. rx.match(s, start, end):
      若是正則表達式在字符串的起始處匹配,就返回一個匹配對象,不然返回None
    5. rx.sub(x, s, m):
      返回一個字符串。每個匹配的地方用x進行替換,返回替換後的字符串,若是指定m,則最多替換m次。對於x可使用/i或者/g<id>id能夠是組名或者編號來引用捕獲到的內容。
      模塊方法re.sub(r, x, s, m)中的x可使用一個函數。此時咱們就能夠對捕獲到的內容推過這個函數進行處理後再替換匹配到的文本。
    6. rx.subn(x, s, m):
      與re.sub()方法相同,區別在於返回的是二元組,其中一項是結果字符串,一項是作替換的個數。
    7. rx.split(s, m):分割字符串
      返回一個列表
      用正則表達式匹配到的內容對字符串進行分割
      若是正則表達式中存在分組,則把分組匹配到的內容放在列表中每兩個分割的中間做爲列表的一部分,如:
      rx = re.compile(r"(d)[a-z]+(d)")
      s = "ab12dk3klj8jk9jks5"
      result = rx.split(s)
      返回['ab1', '2', '3', 'klj', '8', '9', 'jks5']
    8. rx.flags():正則表達式編譯時設置的標誌
    9. rx.pattern():正則表達式編譯時使用的字符串
 2.4 匹配對象的屬性與方法
    01. m.group(g, ...)
      返回編號或者組名匹配到的內容,默認或者0表示整個表達式匹配到的內容,若是指定多個,就返回一個元組
    02. m.groupdict(default)
      返回一個字典。字典的鍵是全部命名的組的組名,值爲命名組捕獲到的內容
      若是有default參數,則將其做爲那些沒有參與匹配的組的默認值。
    03. m.groups(default)
      返回一個元組。包含全部捕獲到內容的子分組,從1開始,若是指定了default值,則這個值做爲那些沒有捕獲到內容的組的值
    04. m.lastgroup()
      匹配到內容的編號最高的捕獲組的名稱,若是沒有或者沒有使用名稱則返回None(不經常使用)
    05. m.lastindex()
      匹配到內容的編號最高的捕獲組的編號,若是沒有就返回None。
    06. m.start(g):
      當前匹配對象的子分組是從字符串的那個位置開始匹配的,若是當前組沒有參與匹配就返回-1
    07. m.end(g)
      當前匹配對象的子分組是從字符串的那個位置匹配結束的,若是當前組沒有參與匹配就返回-1
    08. m.span()
      返回一個二元組,內容分別是m.start(g)和m.end(g)的返回值
    09. m.re()
      產生這一匹配對象的正則表達式
    10. m.string()
      傳遞給match或者search用於匹配的字符串
    11. m.pos()
      搜索的起始位置。即字符串的開頭,或者start指定的位置(不經常使用)
    12. m.endpos()
      搜索的結束位置。即字符串的末尾位置,或者end指定的位置(不經常使用)
2.5 總結
    1. 對於正則表達式的匹配功能,Python沒有返回true和false的方法,但能夠經過對match或者search方法的返回值是不是None來判斷
    2. 對於正則表達式的搜索功能,若是隻搜索一次可使用search或者match方法返回的匹配對象獲得,對於搜索屢次可使用finditer方法返回的可迭代對象來迭代訪問
    3. 對於正則表達式的替換功能,可使用正則表達式對象的sub或者subn方法來實現,也能夠經過re模塊方法sub或者subn來實現,區別在於模塊的sub方法的替換文本可使用一個函數來生成
    4. 對於正則表達式的分割功能,可使用正則表達式對象的split方法,須要注意若是正則表達式對象有分組的話,分組捕獲的內容也會放到返回的列表中htm


做者:GreatAnt
來源: cnblogs.com/greatfish/p
相關文章
相關標籤/搜索