python  -------re模塊
正則表達(dá)式正則表達(dá)式本身是一種小型的、高度專業(yè)化的編程語(yǔ)言而在python中通過(guò)內(nèi)嵌集成re模塊程序員們可以直接調(diào)用來(lái)實(shí)現(xiàn)正則匹配。正則表達(dá)式模式被編譯成一系列的字節(jié)碼然后由用C編寫(xiě)的匹配引擎執(zhí)行。正則表達(dá)式是用來(lái)匹配處理字符串的 python 中使用正則表達(dá)式需要引入re模塊如import re #第一步要引入re模塊a re.findall(“匹配規(guī)則”, “要匹配的字符串”) #第二步調(diào)用模塊函數(shù)以列表形式返回匹配到的字符串如#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(匹配規(guī)則, 這個(gè)字符串是否有匹配規(guī)則的字符) #第二步調(diào)用模塊函數(shù) print(a) #以列表形式返回匹配到的字符串 #打印出 [匹配規(guī)則]^ 元字符:字符串開(kāi)始位置與匹配規(guī)則符合就匹配否則不匹配匹配字符串開(kāi)頭。在多行模式中匹配每一行的開(kāi)頭(ps: ^ 元字符如果寫(xiě)到[]字符集里就是反取)#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(^匹配規(guī)則, 匹配規(guī)則這個(gè)字符串是否匹配) #字符串開(kāi)始位置與匹配規(guī)則符合就匹配否則不匹配 print(a) #以列表形式返回匹配到的字符串 #打印出 [匹配規(guī)則]反取舉例#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall([^a-z], 匹配s規(guī)則這s個(gè)字符串是否s匹配f規(guī)則則re則則則) #反取匹配出除字母外的字符 print(a) #以列表形式返回匹配到的字符串 #打印出 [匹, 配, 規(guī), 則, 這, 個(gè), 字, 符, 串, 是, 否, 匹, 配, 規(guī), 則, 則, 則, 則, 則]$ 元字符:字符串結(jié)束位置與匹配規(guī)則符合就匹配否則不匹配匹配字符串末尾在多行模式中匹配每一行的末尾#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(匹配規(guī)則$, 這個(gè)字符串是否匹配規(guī)則) #字符串結(jié)束位置與匹配規(guī)則符合就匹配否則不匹配 print(a) #以列表形式返回匹配到的字符串 #打印出 [匹配規(guī)則]元字符:需要字符串里完全符合匹配規(guī)則就匹配規(guī)則里的元字符前面的一個(gè)字符可以是0個(gè)或多個(gè)原本字符匹配前一個(gè)字符0或多次貪婪匹配前導(dǎo)字符有多少個(gè)就匹配多少個(gè)很貪婪如果規(guī)則里只有一個(gè)分組盡量避免用*否則會(huì)有可能匹配出空字符串#!/usr/bin/env python-- coding:utf-8 --import re #第一步要引入re模塊 a re.findall(匹配規(guī)則*, 這個(gè)字符串是否匹配規(guī)則則則則則) #需要字符串里完全符合匹配規(guī)則就匹配規(guī)則里的*元字符前面的一個(gè)字符可以是0或多個(gè)原本字符 print(a) #以列表形式返回匹配到的字符串 #打印出 [匹配規(guī)則則則則則]元字符:需要字符串里完全符合匹配規(guī)則就匹配規(guī)則里的元字符前面的一個(gè)字符可以是1個(gè)或多個(gè)原本字符匹配前一個(gè)字符1次或無(wú)限次貪婪匹配前導(dǎo)字符有多少個(gè)就匹配多少個(gè)很貪婪#!/usr/bin/env python# -*- coding:gbk -*- import re #第一步要引入re模塊 a re.findall(匹配, 匹配配配配配規(guī)則這個(gè)字符串是否匹配規(guī)則則則則則) #需要字符串里完全符合匹配規(guī)則就匹配規(guī)則里的元字符前面的一個(gè)字符可以是1個(gè)或多個(gè)原本字符 print(a) #以列表形式返回匹配到的字符串 #打印出 [匹配配配配配, 匹配]? 元字符和防止貪婪匹配:需要字符串里完全符合匹配規(guī)則就匹配規(guī)則里的?元字符前面的一個(gè)字符可以是0個(gè)或1個(gè)原本字符匹配一個(gè)字符0次或1次還有一個(gè)功能是可以防止貪婪匹配詳情見(jiàn)防貪婪匹配#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(匹配規(guī)則?, 匹配規(guī)這個(gè)字符串是否匹配規(guī)則則則則則) #需要字符串里完全符合匹配規(guī)則就匹配規(guī)則里的?元字符前面的一個(gè)字符可以是0個(gè)或1個(gè)原本字符 print(a) #以列表形式返回匹配到的字符串 #打印出 [匹配規(guī), 匹配規(guī)則]{} 元字符,范圍:需要字符串里完全符合匹配規(guī)則就匹配規(guī)則里的 {} 元字符前面的一個(gè)字符是自定義字符數(shù)位數(shù)的原本字符{m}匹配前一個(gè)字符m次{m,n}匹配前一個(gè)字符m至n次若省略n則匹配m至無(wú)限次{0,}匹配前一個(gè)字符0或多次,等同于*元字符{,}匹配前一個(gè)字符1次或無(wú)限次,等同于元字符{0,1}匹配前一個(gè)字符0次或1次,等同于?元字符#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(匹配規(guī)則{3}, 匹配規(guī)這個(gè)字符串是否匹配規(guī)則則則則則) #{m}匹配前一個(gè)字符m次{m,n}匹配前一個(gè)字符m至n次若省略n則匹配m至無(wú)限次 print(a) #以列表形式返回匹配到的字符串 #打印出 [匹配規(guī)則則則][] 元字符,字符集:需要字符串里完全符合匹配規(guī)則就匹配規(guī)則里的 [] 元字符對(duì)應(yīng)位置是[]里的任意一個(gè)字符就匹配字符集。對(duì)應(yīng)的位置可以是字符集中任意字符。字符集中的字符可以逐個(gè)列出也可以給出范圍如[abc]或[a-c]。[^abc]表示取反即非abc。所有特殊字符在字符集中都失去其原有的特殊含義。用\反斜杠轉(zhuǎn)義恢復(fù)特殊字符的特殊含義。#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(匹配[a,b,c]規(guī)則, 匹配a規(guī)則這個(gè)字符串是否匹配b規(guī)則則則則則) #需要字符串里完全符合匹配規(guī)則就匹配規(guī)則里的 [] 元字符對(duì)應(yīng)位置是[]里的任意一個(gè)字符就匹配 print(a) #以列表形式返回匹配到的字符串 [^]非反取匹配出除[^]里面的字符^元字符如果寫(xiě)到字符集里就是反取 a re.findall([^a-z], 匹配s規(guī)則這s個(gè)字符串是否s匹配f規(guī)則則re則則則) #反取匹配出除字母外的字符 print(a) #以列表形式返回匹配到的字符串 #打印出 [匹, 配, 規(guī), 則, 這, 個(gè), 字, 符, 串, 是, 否, 匹, 配, 規(guī), 則, 則, 則, 則, 則]反斜杠后邊跟普通字符實(shí)現(xiàn)特殊功能即預(yù)定義字符預(yù)定義字符是在字符集和組里都是有用的\d匹配任何十進(jìn)制數(shù)它相當(dāng)于類[0-9]#!/usr/bin/env python# -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(\d, 匹配規(guī)則這2個(gè)字符串3是否匹配規(guī)則5則則則7則) #\d匹配任何十進(jìn)制數(shù)它相當(dāng)于類[0-9] print(a) #以列表形式返回匹配到的字符串 #打印出 [2, 3, 5, 7]\d如果需要匹配一位或者多位數(shù)的數(shù)字時(shí)用#!/usr/bin/env python # -*- coding:gbk -*- import re #第一步要引入re模塊 a re.findall(\d, 匹配規(guī)則這2個(gè)字符串134444是否匹配規(guī)則5則則則7則) #\d如果需要匹配一位或者多位數(shù)的數(shù)字時(shí)用 print(a) #以列表形式返回匹配到的字符串 #打印出 [2, 134444, 5, 7]\D 匹配任何非數(shù)字字符它相當(dāng)于類[^0-9]#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(\D, 匹配規(guī)則這2個(gè)字符串3是否匹配規(guī)則5則則則7則) #\D匹配任何非數(shù)字字符它相當(dāng)于類[^0-9] print(a) #以列表形式返回匹配到的字符串 #打印出 [匹, 配, 規(guī), 則, 這, 個(gè), 字, 符, 串, 是, 否, 匹, 配, 規(guī), 則, 則, 則, 則, 則]\s 匹配任何空白字符它相當(dāng)于類[\t\n\r\f\v]#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(\s, 匹配規(guī)則 這2個(gè)字符串3是否匹\n配規(guī)則5則則則7則) #\s匹配任何空白字符它相當(dāng)于類[\t\n\r\f\v] print(a) #以列表形式返回匹配到的字符串 #打印出[ , , , \n]\S 匹配任何非空白字符它相當(dāng)于類[^\t\n\r\f\v]#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(\S, 匹配規(guī)則 這2個(gè)字符串3是否匹\n配規(guī)則5則則則7則) #\S匹配任何非空白字符它相當(dāng)于類[^\t\n\r\f\v] print(a) #以列表形式返回匹配到的字符串 #打印出 [匹, 配, 規(guī), 則, 這, 2, 個(gè), 字, 符, 串, 3, 是, 否, 匹, 配, 規(guī), 則, 5, 則, 則, 則, 7, 則]\w 匹配包括下劃線在內(nèi)任何字母數(shù)字字符它相當(dāng)于類[a-zA-Z0-9_]#!/usr/bin/env python # -*- coding:utf8 -*- import re #第一步要引入re模塊 a re.findall(\w,https://www.cnblogs.com/) #\w匹配包括下劃線在內(nèi)任何字母數(shù)字字符它相當(dāng)于類[a-zA-Z0-9_] print(a) #以列表形式返回匹配到的字符串 #打印出 [h, t, t, p, s, w, w, w, c, n, b, l, o, g, s, c, o, m]\W匹配非任何字母數(shù)字字符包括下劃線在內(nèi)它相當(dāng)于類[^a-zA-Z0-9_]import re #第一步要引入re模塊 a re.findall(\W,https://www.cnblogs.com/) #\w匹配包括下劃線在內(nèi)任何字母數(shù)字字符它相當(dāng)于類[a-zA-Z0-9_] print(a) #以列表形式返回匹配到的字符串 #打印出[:, /, /, ., ., /]()元字符分組也就是分組匹配()里面的為一個(gè)組也可以理解成一個(gè)整體如果()后面跟的是特殊元字符如 (adc)* 那么*控制的前導(dǎo)字符就是()里的整體內(nèi)容不再是前導(dǎo)一個(gè)字符#!/usr/bin/env python # -*- coding:utf8 -*- import re #第一步要引入re模塊 #也就是分組匹配()里面的為一個(gè)組也可以理解成一個(gè)整體 a re.search((a4), a4a4a4a4a4dg4g654gb) #匹配一個(gè)或多個(gè)a4 b a.group() print(b) #打印出 a4a4a4a4a4 #!/usr/bin/env python # -*- coding:utf8 -*- import re #第一步要引入re模塊 #也就是分組匹配()里面的為一個(gè)組也可以理解成一個(gè)整體 a re.search(a(\d), a466666664a4a4a4dg4g654gb) #匹配 (a) (\d0-9的數(shù)字) (可以是1個(gè)到多個(gè)0-9的數(shù)字) b a.group() print(b) #打印出 a466666664|元字符或|或或就是前后其中一個(gè)符合就匹配#!/usr/bin/env python # -*- coding:utf8 -*- import re #第一步要引入re模塊 a re.findall(r你|好, a4a4a你4aabc4a4dgg好dg4g654g) #|或或就是前后其中一個(gè)符合就匹配 print(a) #打印出 [你, 好]r原生字符將在python里有特殊意義的字符如\b轉(zhuǎn)換成原生字符就是去除它在python的特殊意義不然會(huì)給正則表達(dá)式有沖突為了避免這種沖突可以在規(guī)則前加原始字符rre模塊中常用功能函數(shù)正則表達(dá)式有兩種書(shū)寫(xiě)方式一種是直接在函數(shù)里書(shū)寫(xiě)規(guī)則#!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步要引入re模塊 a re.findall(匹配規(guī)則, 這個(gè)字符串是否有匹配規(guī)則的字符) #第二步調(diào)用模塊函數(shù) print(a) #以列表形式返回匹配到的字符串 #打印出 [匹配規(guī)則]match()函數(shù)以后常用match從頭匹配一個(gè)符合規(guī)則的字符串從起始位置開(kāi)始匹配匹配成功返回一個(gè)對(duì)象未匹配成功返回Nonematch(pattern, string, flags0)#pattern 正則模型#string 要匹配的字符串#falgs 匹配模式注意match()函數(shù) 與 search()函數(shù)基本是一樣的功能不一樣的就是match()匹配字符串開(kāi)始位置的一個(gè)符合規(guī)則的字符串search()是在字符串全局匹配第一個(gè)合規(guī)則的字符串#!/usr/bin/env python # -*- coding:utf8 -*- import re #無(wú)分組 origin hello egon bcd egon lge egon acd 19 r re.match(h\w, origin) #match從起始位置開(kāi)始匹配匹配成功返回一個(gè)對(duì)象未匹配成功返回None print(r.group()) # 獲取匹配到的所有結(jié)果不管有沒(méi)有分組將匹配到的全部拿出來(lái) print(r.groups()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分的結(jié)果 print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分定義了key的組結(jié)果 #輸出結(jié)果 # hello 匹配到的全部拿出來(lái) # () 沒(méi)有分組所以為空 # {} 沒(méi)分組部分定義了key的組所以為空 # 有分組 # 為何要有分組提取匹配成功的指定內(nèi)容先匹配成功全部正則再匹配成功的局部?jī)?nèi)容提取出來(lái) r re.match(h(\w), origin) #match從起始位置開(kāi)始匹配匹配成功返回一個(gè)對(duì)象未匹配成功返回None print(r.group()) # 獲取匹配到的所有結(jié)果不管有沒(méi)有分組將匹配到的全部拿出來(lái) print(r.groups()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分的結(jié)果 print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分定義了key的組結(jié)果 #輸出結(jié)果 # hello 匹配到的全部拿出來(lái) # (ello,) 有分組在匹配到的字符串中拿出分組的部分 # {} 沒(méi)分組部分定義了key的組所以為空 # 有兩個(gè)分組定義了key # 為何要有分組提取匹配成功的指定內(nèi)容先匹配成功全部正則再匹配成功的局部?jī)?nèi)容提取出來(lái) r re.match((?Pn1h)(?Pn2\w), origin) #?P定義組里匹配內(nèi)容的key(鍵)里面寫(xiě)key名稱值就是匹配到的內(nèi)容 print(r.group()) # 獲取匹配到的所有結(jié)果不管有沒(méi)有分組將匹配到的全部拿出來(lái) print(r.groups()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分的結(jié)果 print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分定義了key的組結(jié)果 #輸出結(jié)果 # hello 匹配到的全部拿出來(lái) # (h, ello) 有分組在匹配到的字符串中拿出分組的部分 # {n1: h, n2: ello} 有定義了key的組所以將定義了key的組里的內(nèi)容以字典形式拿出來(lái)search()函數(shù)search,瀏覽全部字符串匹配第一符合規(guī)則的字符串瀏覽整個(gè)字符串去匹配第一個(gè)未匹配成功返回Nonesearch(pattern, string, flags0)#pattern 正則模型#string 要匹配的字符串#falgs 匹配模式注意match()函數(shù) 與 search()函數(shù)基本是一樣的功能不一樣的就是match()匹配字符串開(kāi)始位置的一個(gè)符合規(guī)則的字符串search()是在字符串全局匹配第一個(gè)合規(guī)則的字符串#!/usr/bin/env python # -*- coding:utf8 -*- import re #無(wú)分組 origin hello alex bcd alex lge alex acd 19 r re.search(a\w, origin) #search瀏覽全部字符串匹配第一符合規(guī)則的字符串瀏覽整個(gè)字符串去匹配第一個(gè)未匹配成功返回None print(r.group()) # 獲取匹配到的所有結(jié)果不管有沒(méi)有分組將匹配到的全部拿出來(lái) print(r.groups()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分的結(jié)果 print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分定義了key的組結(jié)果 #輸出結(jié)果 # alex 匹配到的全部拿出來(lái) # () 沒(méi)有分組所以為空 # {} 沒(méi)分組部分定義了key的組所以為空 # 有分組 # 為何要有分組提取匹配成功的指定內(nèi)容先匹配成功全部正則再匹配成功的局部?jī)?nèi)容提取出來(lái) r re.search(a(\w).*(\d), origin) print(r.group()) # 獲取匹配到的所有結(jié)果不管有沒(méi)有分組將匹配到的全部拿出來(lái) print(r.groups()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分的結(jié)果 print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分定義了key的組結(jié)果 #輸出結(jié)果 # alex bcd alex lge alex acd 19 匹配到的全部拿出來(lái) # (lex, 9) 有分組在匹配到的字符串中拿出分組的部分 # {} 沒(méi)分組部分定義了key的組所以為空 # 有兩個(gè)分組定義了key # 為何要有分組提取匹配成功的指定內(nèi)容先匹配成功全部正則再匹配成功的局部?jī)?nèi)容提取出來(lái) r re.search(a(?Pn1\w).*(?Pn2\d), origin) #?P定義組里匹配內(nèi)容的key(鍵)里面寫(xiě)key名稱值就是匹配到的內(nèi)容 print(r.group()) # 獲取匹配到的所有結(jié)果不管有沒(méi)有分組將匹配到的全部拿出來(lái) print(r.groups()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分的結(jié)果 print(r.groupdict()) # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分定義了key的組結(jié)果 #輸出結(jié)果 # alex bcd alex lge alex acd 19 匹配到的全部拿出來(lái) # (lex, 9) 有分組在匹配到的字符串中拿出分組的部分 # {n1: lex, n2: 9} 有定義了key的組所以將定義了key的組里的內(nèi)容以字典形式拿出來(lái)findall()函數(shù)以后常用findall(pattern, string, flags0)#pattern 正則模型#string 要匹配的字符串#falgs 匹配模式瀏覽全部字符串匹配所有合規(guī)則的字符串匹配到的字符串放到一個(gè)列表中未匹配成功返回空列表注意一旦匹配成再次匹配是從前一次匹配成功的后面一位開(kāi)始的也可以理解為匹配成功的字符串不在參與下次匹配#!/usr/bin/env python # -*- coding:utf8 -*- import re #無(wú)分組 r re.findall(\d\w\d, a2b3c4d5) #瀏覽全部字符串匹配所有合規(guī)則的字符串匹配到的字符串放到一個(gè)列表中 print(r) #輸出結(jié)果 #[2b3, 4d5] #注意匹配成功的字符串不在參與下次匹配,所以3c4也符合規(guī)則但是沒(méi)匹配到注意如果沒(méi)寫(xiě)匹配規(guī)則也就是空規(guī)則返回的是一個(gè)比原始字符串多一位的空字符串列表#!/usr/bin/env python # -*- coding:utf8 -*- import re #無(wú)分組 r re.findall(, a2b3c4d5) #瀏覽全部字符串匹配所有合規(guī)則的字符串匹配到的字符串放到一個(gè)列表中 print(r) #輸出結(jié)果 #[, , , , , , , , ] #注意如果沒(méi)寫(xiě)匹配規(guī)則也就是空規(guī)則返回的是一個(gè)比原始字符串多一位的空字符串列表 復(fù)制代碼注意正則匹配到空字符的情況如果規(guī)則里只有一個(gè)組而組后面是就表示組里的內(nèi)容可以是0個(gè)或者多過(guò)這樣組里就有了兩個(gè)意思一個(gè)意思是匹配組里的內(nèi)容二個(gè)意思是匹配組里0內(nèi)容即是空白所以盡量避免用否則會(huì)有可能匹配出空字符串注意正則只拿組里最后一位如果規(guī)則里只有一個(gè)組匹配到的字符串里在拿組內(nèi)容是拿的是匹配到的內(nèi)容最后一位#!/usr/bin/env python # -*- coding:utf8 -*- import re origin hello alex bcd alex lge alex acd 19 r re.findall((a)*, origin) print(r) #輸出結(jié)果 [, , , , , , a, , , , , , , , , a, , , , , , , , , a, , , , , a, , , , , , ]無(wú)分組匹配所有合規(guī)則的字符串匹配到的字符串放到一個(gè)列表中#!/usr/bin/env python # -*- coding:utf8 -*- import re #無(wú)分組 origin hello alex bcd alex lge alex acd 19 r re.findall(a\w, origin) #瀏覽全部字符串匹配所有合規(guī)則的字符串匹配到的字符串放到一個(gè)列表中 print(r) #輸出結(jié)果 #[alex, alex, alex, acd] #匹配所有合規(guī)則的字符串匹配到的字符串放到一個(gè)列表中 復(fù)制代碼有分組只將匹配到的字符串里組的部分放到列表里返回相當(dāng)于groups()方法#!/usr/bin/env python # -*- coding:utf8 -*- import re origin hello alex bcd alex lge alex acd 19 r re.findall(a(\w), origin) #有分組只將匹配到的字符串里組的部分放到列表里返回 print(r) #輸出結(jié)果 #[lex, lex, lex, cd]多個(gè)分組只將匹配到的字符串里組的部分放到一個(gè)元組中最后將所有元組放到一個(gè)列表里返相當(dāng)于在group()結(jié)果里再將組的部分分別拿出來(lái)放入一個(gè)元組最后將所有元組放入一個(gè)列表返回#!/usr/bin/env python # -*- coding:utf8 -*- import re origin hello alex bcd alex lge alex acd 19 r re.findall((a)(\w), origin) #多個(gè)分組只將匹配到的字符串里組的部分放到一個(gè)元組中最后將所有元組放到一個(gè)列表里返回 print(r) #輸出結(jié)果 #[(a, lex), (a, lex), (a, lex), (a, cd)]分組中有分組只將匹配到的字符串里組的部分放到一個(gè)元組中先將包含有組的組看作一個(gè)整體也就是一個(gè)組把這個(gè)整體組放入一個(gè)元組里然后在把組里的組放入一個(gè)元組最后將所有組放入一個(gè)列表返回#!/usr/bin/env python # -*- coding:utf8 -*- import re origin hello alex bcd alex lge alex acd 19 r re.findall((a)(\w(e)), origin) #分組中有分組只將匹配到的字符串里組的部分放到一個(gè)元組中先將包含有組的組看作一個(gè)整體也就是一個(gè)組把這個(gè)整體組放入一個(gè)元組里然后在把組里的組放入一個(gè)元組最后將所有組放入一個(gè)列表返回 print(r) #輸出結(jié)果 #[(a, le, e), (a, le, e), (a, le, e)]?:在有分組的情況下findall()函數(shù)不只拿分組里的字符串拿所有匹配到的字符串注意?:只用于不是返回正則對(duì)象的函數(shù)如findall()#!/usr/bin/env python # -*- coding:utf8 -*- import re origin hello alex bcd alex lge alex acd 19 b re.findall(a(?:\w),origin) #?:在有分組的情況下不只拿分組里的字符串拿所有匹配到的字符串注意?:只用于不是返回正則對(duì)象的函數(shù)如findall() print(b) #輸出 # [alex, alex, alex, acd]split()函數(shù)根據(jù)正則匹配分割字符串返回分割后的一個(gè)列表split(pattern, string, maxsplit0, flags0)#pattern 正則模型#string 要匹配的字符串#maxsplit指定分割個(gè)數(shù)#flags 匹配模式按照一個(gè)字符將全部字符串進(jìn)行分割#!/usr/bin/env python # -*- coding:utf8 -*- import re origin hello alex bcd alex lge alex acd 19 r re.split(a, origin) #根據(jù)正則匹配分割字符串 print(r) #輸出結(jié)果 [hello , lex bcd , lex lge , lex , cd 19] #根據(jù)a進(jìn)行分組將匹配到的字符串作為分割標(biāo)準(zhǔn)進(jìn)行分割#!/usr/bin/env python # -*- coding:utf8 -*- import re origin hello alex bcd alex lge alex 2acd 19 r re.split(a\w, origin) #根據(jù)正則匹配分割字符串 print(r) #輸出結(jié)果 [hello , bcd , lge , 2, 19] #將匹配到的字符串作為分割標(biāo)準(zhǔn)進(jìn)行分割 復(fù)制代碼sub()函數(shù)替換匹配成功的指定位置字符串sub(pattern, repl, string, count0, flags0)#pattern 正則模型#repl 要替換的字符串#string 要匹配的字符串#count 指定匹配個(gè)數(shù)#flags 匹配模式#!/usr/bin/env python # -*- coding:utf8 -*- import re origin hello alex bcd alex lge alex acd 19 r re.sub(a,替換,origin) #替換匹配成功的指定位置字符串 print(r) #輸出 # hello 替換lex bcd 替換lex lge 替換lex 替換cd 19subn()函數(shù)替換匹配成功的指定位置字符串,并且返回替換次數(shù)可以用兩個(gè)變量分別接受subn(pattern, repl, string, count0, flags0)#pattern 正則模型#repl 要替換的字符串#string 要匹配的字符串#count 指定匹配個(gè)數(shù)#flags 匹配模式#!/usr/bin/env python # -*- coding:utf8 -*- import re origin hello alex bcd alex lge alex acd 19 a,b re.subn(a,替換,origin) #替換匹配成功的指定位置字符串,并且返回替換次數(shù)可以用兩個(gè)變量分別接受 print(a) print(b) #輸出 # hello 替換lex bcd 替換lex lge 替換lex 替換cd 19 # 4常用. 默認(rèn)匹配除\n之外的任意一個(gè)字符若指定flag DOTALL,則匹配任意字符包括換行 ^ 匹配字符開(kāi)頭若指定flags MULTILINE,這種也可以匹配上(r^a,\nabc\neee,flagsre.MULTILINE) $ 匹配字符結(jié)尾或e.search(foo$,bfoo\nsdfsf,flagsre.MULTILINE).group()也可以 * 匹配*號(hào)前的字符0次或多次re.findall(ab*,cabb3abcbbac) 結(jié)果為[abb, ab, a] 匹配前一個(gè)字符1次或多次re.findall(ab,abcdabbbba) 結(jié)果[ab, abb] ? 匹配前一個(gè)字符1次或0次 {m} 匹配前一個(gè)字符m次 {n,m} 匹配前一個(gè)字符n到m次re.findall(ab{1,3},abb abc abbcbbb) 結(jié)果abb, ab, abb] | 匹配|左或|右的字符re.search(abc|ABC,ABCBabcCD).group() 結(jié)果ABC (...) 分組匹配re.search((abc){2}a(123|456)c, abcabca456c).group() 結(jié)果 abcabca456c \A 只從字符開(kāi)頭匹配re.search(\Aabc,alexabc) 是匹配不到的 \Z 匹配字符結(jié)尾同$ \d 匹配數(shù)字0-9 \D 匹配非數(shù)字 \w 匹配[A-Za-z0-9] \W 匹配非[A-Za-z0-9] s 匹配空白字符、\t、\n、\r , re.search(\s,ab\tc1\n3).group() 結(jié)果 \t (?Pname...) 分組匹配 re.search((?Pprovince[0-9]{4})(?Pcity[0-9]{2})(?Pbirthday[0-9]{4}),371481199306143242).groupdict(city) 結(jié)果{province: 3714, city: 81, birthday: 1993}正則表達(dá)式重點(diǎn):一、r原生字符將在python里有特殊意義的字符如\b轉(zhuǎn)換成原生字符就是去除它在python的特殊意義不然會(huì)給正則表達(dá)式有沖突為了避免這種沖突可以在規(guī)則前加原始字符r二、正則表達(dá)式返回類型為表達(dá)式對(duì)象的如_sre.SRE_Match object; span(6, 7), match‘a(chǎn)’返回對(duì)象的需要用正則方法取字符串方法有g(shù)roup() # 獲取匹配到的所有結(jié)果不管有沒(méi)有分組將匹配到的全部拿出來(lái)有參取匹配到的第幾個(gè)如2groups() # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分的結(jié)果groupdict() # 獲取模型中匹配到的分組結(jié)果只拿出匹配到的字符串中分組部分定義了key的組結(jié)果三、匹配到的字符串里出現(xiàn)空字符注意正則匹配到空字符的情況如果規(guī)則里只有一個(gè)組而組后面是就表示組里的內(nèi)容可以是0個(gè)或者多過(guò)這樣組里就有了兩個(gè)意思一個(gè)意思是匹配組里的內(nèi)容二個(gè)意思是匹配組里0內(nèi)容即是空白所以盡量避免用否則會(huì)有可能匹配出空字符串四、()分組注意分組的意義就是在匹配成功的字符串中在提取()里組里面的字符串五、?:在有分組的情況下findall()函數(shù)不只拿分組里的字符串拿所有匹配到的字符串注意?:只用于不是返回正則對(duì)象的函數(shù)如findall()

相關(guān)新聞

企業(yè)裁員賠償方案設(shè)計(jì)與實(shí)施全解析

企業(yè)裁員賠償方案設(shè)計(jì)與實(shí)施全解析

1. 企業(yè)人員調(diào)整背后的經(jīng)濟(jì)邏輯最近某大型企業(yè)宣布裁員6.4萬(wàn)余人的消息引發(fā)廣泛關(guān)注,其中"N4"的高額賠償方案更是成為討論焦點(diǎn)。作為經(jīng)歷過(guò)多次企業(yè)組織調(diào)整的HR從業(yè)者,我想從實(shí)際操作層面解析這類大規(guī)模人員調(diào)整背后的決策邏輯和執(zhí)行細(xì)節(jié)。企…

2026/7/28 19:26:40 閱讀更多
零代碼改造Codex:低成本接入DeepSeek實(shí)現(xiàn)高效AI編程

零代碼改造Codex:低成本接入DeepSeek實(shí)現(xiàn)高效AI編程

如果你正在使用 Codex 作為 AI 編程助手,但覺(jué)得官方模型調(diào)用成本太高,或者希望獲得更符合中文開(kāi)發(fā)者習(xí)慣的代碼建議,那么這篇文章就是為你準(zhǔn)備的。Codex 本身是一個(gè)強(qiáng)大的 AI 編程工具,但其默認(rèn)的官方模型(如 GPT-4&am…

2026/7/28 19:26:40 閱讀更多
NBM7100A電池增強(qiáng)器在物聯(lián)網(wǎng)節(jié)點(diǎn)的能效優(yōu)化實(shí)踐

NBM7100A電池增強(qiáng)器在物聯(lián)網(wǎng)節(jié)點(diǎn)的能效優(yōu)化實(shí)踐

1. 項(xiàng)目背景與核心挑戰(zhàn)在物聯(lián)網(wǎng)設(shè)備井噴式發(fā)展的今天,無(wú)線傳感器節(jié)點(diǎn)作為數(shù)據(jù)采集的神經(jīng)末梢,其供電問(wèn)題始終是制約設(shè)備部署的關(guān)鍵瓶頸。我曾參與過(guò)一個(gè)農(nóng)業(yè)環(huán)境監(jiān)測(cè)項(xiàng)目,當(dāng)看到300個(gè)傳感器節(jié)點(diǎn)中有23%因電池耗盡提前"陣亡"時(shí)&…

2026/7/28 19:26:40 閱讀更多
MicroPython模塊1.2.6解析:從核心機(jī)制到硬件驅(qū)動(dòng)實(shí)戰(zhàn)

MicroPython模塊1.2.6解析:從核心機(jī)制到硬件驅(qū)動(dòng)實(shí)戰(zhàn)

1. 項(xiàng)目概述:從“模塊”到“生態(tài)”的認(rèn)知升級(jí)當(dāng)你第一次在MicroPython的官方文檔或GitHub倉(cāng)庫(kù)里看到“MicroPython模塊 1.2.6”這個(gè)標(biāo)題時(shí),可能會(huì)覺(jué)得這只是一個(gè)普通的版本更新日志。但如果你像我一樣,在嵌入式開(kāi)發(fā)和物聯(lián)網(wǎng)領(lǐng)域摸爬滾打了十幾…

2026/7/29 3:46:02 閱讀更多
AE、VAE、CVAE

AE、VAE、CVAE

簡(jiǎn)單講解一下三個(gè)主要的自動(dòng)編碼器 主要思路都是采用一個(gè)編碼器和一個(gè)解碼器。輸入內(nèi)容經(jīng)過(guò)編碼器編碼為潛變量zzz,潛變量zzz經(jīng)過(guò)解碼器解碼為輸出內(nèi)容。 AE(Auto Encoder),這是最簡(jiǎn)單的自動(dòng)編碼器,其潛變量是一種低維編碼&#x…

2026/7/29 3:46:02 閱讀更多
AI芯片混戰(zhàn):OpenAI用AMD、DeepSeek用昇騰、英偉達(dá)5000億鎖HBM——誰(shuí)在挑戰(zhàn)芯片王座?

AI芯片混戰(zhàn):OpenAI用AMD、DeepSeek用昇騰、英偉達(dá)5000億鎖HBM——誰(shuí)在挑戰(zhàn)芯片王座?

英偉達(dá)的王座到底穩(wěn)不穩(wěn)?這可能是2026年AI行業(yè)最難回答的問(wèn)題之一。過(guò)去十幾天,市場(chǎng)給出了兩個(gè)看起來(lái)有些矛盾的信號(hào):AMD簽下Anthropic和OpenAI的大單,股價(jià)年內(nèi)漲了142%;英偉達(dá)數(shù)據(jù)中心收入依然是AMD的11倍以上&#x…

2026/7/29 3:46:02 閱讀更多
C++實(shí)戰(zhàn)指南:從核心價(jià)值到現(xiàn)代工具鏈,探索高性能編程的未來(lái)

C++實(shí)戰(zhàn)指南:從核心價(jià)值到現(xiàn)代工具鏈,探索高性能編程的未來(lái)

1. 從“老兵”視角看C的當(dāng)下與未來(lái)最近在社區(qū)里,看到不少關(guān)于“C是否過(guò)時(shí)”、“學(xué)C還有沒(méi)有前途”的討論。作為一個(gè)從大學(xué)就開(kāi)始摸C,在工業(yè)界用它寫(xiě)過(guò)嵌入式驅(qū)動(dòng)、游戲引擎、高頻交易系統(tǒng),也用它調(diào)過(guò)無(wú)數(shù)“段錯(cuò)誤”和“內(nèi)存泄漏”的老兵&…

2026/7/29 3:46:02 閱讀更多
Python中文文本分析實(shí)戰(zhàn):從酒店評(píng)價(jià)挖掘商業(yè)洞察

Python中文文本分析實(shí)戰(zhàn):從酒店評(píng)價(jià)挖掘商業(yè)洞察

1. 項(xiàng)目概述:從酒店評(píng)價(jià)中挖掘商業(yè)洞察最近在復(fù)盤(pán)一個(gè)挺有意思的數(shù)據(jù)分析小項(xiàng)目,核心任務(wù)是對(duì)一堆酒店評(píng)價(jià)文本進(jìn)行挖掘。這活兒聽(tīng)起來(lái)簡(jiǎn)單,不就是看看用戶說(shuō)了啥嘛,但真做起來(lái),從數(shù)據(jù)清洗到得出有商業(yè)價(jià)值的結(jié)論&…

2026/7/29 3:36:01 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過(guò)程中,發(fā)現(xiàn)一個(gè)問(wèn)題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過(guò)來(lái)的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂(lè)應(yīng)用,模擬了真實(shí)擲骰子的過(guò)程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫(huà)效果。…

2026/7/29 0:15:24 閱讀更多