python 正規表示式複雜用法

2021-10-02 22:09:55 字數 2551 閱讀 6445

關於貪婪和非貪婪,貪婪匹配的意思是,在同乙個匹配項中,盡量匹配更多所搜尋的字元,非貪婪則相反。正則匹配的預設模式是貪婪模式,當?號跟在如下限制符後面時,使用非貪婪模式(*,+,?,,,)

如正規表示式 \s+c 匹配字串aaaacaaaaaaac的結果是aaaacaaaaaaac,而\s+?c則會優先匹配aaaac

有時候在使用正規表示式做匹配的時候,我們希望匹配乙個字串,這個字串的前面或後面需要是特定的內容,但我們又不想要前面或後面的這個特定的內容,這時候就需要零寬斷言的幫助了。所謂零寬斷言,簡單來說就是匹配乙個位置,這個位置滿足某個正則,但是不納入匹配結果的,所以叫「零寬」,而且這個位置的前面或後面需要滿足某種正則。

零寬斷言:正向反向兩類,分別用等號(=)和感嘆號(!)表示,每類又分為:前視後視,分別表示位置前後,表示式如果存在小於號(<),表示後視,否則即為前視;

正向前視斷言:語法:(?=exp),它斷言此位置的後面能匹配表示式exp,但不包含此位置;

如:a(?=\d),返回匹配字串中以數字為結尾的a字元。

正向後視斷言:語法:(?<=exp),它斷言此位置的前面能匹配表示式exp;

如:(?<=\d)a,返回匹配字串中以數字為開頭的a字元。

反向前視斷言:語法:(?!exp),它斷言此位置的後面不能匹配表示式exp;

如:a(?!\d),返回不匹配字串中以數字結尾的a字元。

反向後視斷言:語法:(?通過使用 (?ilmsux) 系列選項,使用者可以直接在正規表示式裡面指定乙個或者多個標記,而不是通過 compile()或者其他 re 模組函式。

1、(?i):表示 re.i/ignorecase,忽略大小寫

2、(?l): locale, 字符集本地化。這個功能是為了支援多語言版本的字符集使用環境的,比如在轉義符\w,在英文環境下,它代表[a-za-z0-9_],即所以英文本元和數字。如果在乙個法語環境下使用,預設設定下,不能匹配"é" 或 「ç」。加上這l選項和就可以匹配了。不過這個對於中文環境似乎沒有什麼用,它仍然不能匹配中文字元

3、(?m):表示 re.m/multiline,實現多行混合,data 資料多行

4、(?s):表示符號 . 可以代表任意符號(正常情況符號 . 表示除 \n 之外的任意符號);

5、(?u): unicode,使用 \w, \w, \b, \b 這些元字元時將按照 unicode 定義的屬性;

6、(?x):表示允許使用者通過抑制在正規表示式中使用空白符(除了在字元類中或者反斜線轉義中)來建立更易讀的正規表示式,正規表示式多行;

當我們使用正規表示式的時候,我們經常會使用()把某個部分括起來,稱為乙個子模式。子模式有capturing和non-capturing兩種情況。捕獲的字串會被快取起來以供後續使用,具體表現為每個()中的表示式所匹配到的內容在進行正則匹配的過程中,都會被快取下來。

var testreg=/(a+)(b*)c/;

testreg.test('aaaabbbccc');//輸出true

console.log(regexp.$1);//輸出aaaa

console.log(regexp.$2);//輸出bbb

但是,如果在子分組中加入?:之後,分組依然成立,但是不會被快取下來

var testreg=/(a+)(?:b*)c/;

testreg.test('aaaabbbccc');//輸出true

console.log(regexp.$1);//輸出aaaa

console.log(regexp.$2);//輸出""

當用「()」定義了乙個正規表示式分組後,正則引擎就會把匹配的組按照順序進行編號,然後存 入快取中。這樣我們就可以在後面對已經匹配過的內容進行引用,這就叫後向引用。

1、通過索引引用

\數字 \1表示引用第乙個分組,\2引用第二個分組,以此類推,\n引用第n個組,而\0則表示引用整個被匹配的正規表示式本身。

交換字串的位置

import re

s = 'abc.xyz' # 交換.號兩邊的字串

res = re.sub(r'(.*)\.(.*)', r'\2.\1', s)

print res

>>>xyz.abc

命名分組就是給具體有預設分組編號的組另外再起乙個別名,方便以後的引用。 命令分組的語法格式如下: (?p正規表示式)

語法格式中的字元p必須是大寫的「p」,name是乙個合法的識別符號,表示分組的別名。

s = "ip='230.192.168.78',version='1.0.0'"

res = re.search(r"ip='(?p\d+\.\d+\.\d+\.\d+).*", s)

print res.group('ip')#通過命名分組引用分組

使用命名分組後,可以再使用?p = name呼叫命名分組,即在乙個字串中,匹配由(?p****)命名的分組

(?#****)表示注釋,所有內容都被忽略

python正規表示式用法

在這裡插入 片 re.compile pattern,flags 0 操作符說明例項.表示任何單個字元 字符集,對單個字元給出取值範圍 abc 表示a b c,a z 表示a到z單個字元 非字符集,對單個字元給出排除範圍 abc 表示非a或b或c的單個字元 前乙個字元0次或無限次擴充套件 abc 表...

正規表示式用法

正規表示式的概念 什麼是 什麼是正規表示式?是html的乙個變種。一般情況下,論壇不允許你使用 而只能用 替代 是一套由流行的 標籤組成了固定 有統一的格式。使用者只要遵循 規則就可以實現使用者想要的功能。如 想要顯示粗體的how are you 字樣,就應該輸入 how are you而不是輸入h...

正規表示式用法

乙個正規表示式就是由普通字元 例如字元 a 到 z 以及特殊字元 稱為元字元 組成的文字模式。該模式描述在查詢文字主體時待匹配的乙個或多個字串。正規表示式作為乙個模板,將某個字元模式與所搜尋的字串進行匹配。將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 後向引用 或乙個八進位制轉義符。例如,...