天天看點

python(re 子產品-正規表達式)

1、元字元

  • . 比對除換行符 \n 以外的任意一個字元
import re

s = "shenzhen duoceshi"
print(re.findall("d...e", s))

---> ['duoce']      
  • ^ 尖角符,隻在字元串開頭開始比對
import re

s = "shenzhen duoceshi"
print(re.findall("^s..n", s))
print(re.findall("^z..n", s))

---> ['shen']
---> []      
  • $ 隻在字元串結尾進行比對
import re

s = "shenzhen duoceshi"
print(re.findall("s.i$", s))
print(re.findall("ce$", s))

---> ['shi']
---> []      
  •  * 重複比對,比對前一個字元 0 次或更多次
import re

s = "adbnasdnbaaasdsdba"
print(re.findall("ba*",s))

---> ['b', 'baaa', 'ba']      
  • + 重複比對,比對前一個字元 1 次或更多次
import re

s = "adbnasdnbaaasdsdba"
print(re.findall("ba+",s))

---> ['baaa', 'ba']      
  • ? 比對,比對前一個字元 0 次或 1 次
import re

s = "adbnasdnbaaasdsdba"
print(re.findall("ba?",s))

---> ['b', 'ba', 'ba']      
  • {m} 比對前一個字元 m 次
import re

s = "adbnasdnbaaasdsdba"
print(re.findall("a{4}s",s))    # 比對值為 aaaas
print(re.findall("a{3}s",s))    # 比對值為 aaas
print(re.findall("a{2}s",s))

---> []
---> ['aaas']
---> ['aas']      
  • {m,n} 比對前一個字元 m 到 n 次(包括 n 次),m 或 n 可以省略,m 和 n 都是正整數,{1,} 表示 比對 1 次,或者 +∞ 次
import re

s = "aaaasdbnasdnbaaasdsdbaas"
print(re.findall("a{1,4}s",s)) # 比對 1/2/3/4 次 a

---> ['aaaas', 'as', 'aaas', 'aas']      
  • [m,n] 字元集,比對字元 m 或 n
  • [m-n] 比對 m 到 n 這個範圍内的字元
  • [*,.] 取消元字元,除 \ ^ - 外 
  • [^a,b] 取反,比對字元串中除 a,b 以外的字元
import re

s = "https://www.baidu.com"
print(re.findall("b[a,b,c]",s))
print(re.findall("b[a-c]",s))

---> ['ba']
---> ['ba']      
import re

s = "aaa*bb*c"
print(re.findall("[b*]",s))    # 取消元字元

---> ['*', 'b', 'b', '*']      
import re

s = "aaa*bb*c"
print(re.findall("[^a,b]",s))  # 取反

---> ['*', '*', 'c']      
  • \ 反斜杠
    • 反斜杠後邊跟元字元去除其特殊功能
import re

print(re.findall("a\.", "adas123"))
print(re.findall("a\+", "adas123"))

# 結果如下
[]
[]      
    • 反斜杠後邊跟普通字元實作特殊功能
      • \d 比對任何十進制數字,[0-9]
      • \D 比對任何非數字字元 [^0-9] 
      • \s 比對任何空白字元,[ \t \r \n \f \v]
      • \S比對任何非空白字元 [^\t \r \n \f \v] 
      • \w 比對任何字母數字,[0-9,a-z,A-Z]
      • \W 比對任何非字母數字 [^0-9,a-z,A-Z]
      • \b 比對一個特殊字元的邊界,也就是單詞字母與特殊字元的位置 
import re

print(re.findall("\d{11}", "adas1234567890023456789000345"))
print(re.findall("\D{3}", "adas1234567890023456789000345"))
print(re.findall("\s{2}", "ad\n\ra\rsr\t"))
print(re.findall("\S{2}", "ad\na\rsr\t"))
print(re.findall("\w{2}", "ad 123"))
print(re.findall("\W", "ad 123\r"))、
print(re.findall(r"\ba", "Hello, I am Evan"))

# 結果如下
['12345678900', '23456789000']
['ada']
['\n\r']
['ad', 'sr']
['ad', '12']
[' ', '\r']
['a']      
import re

# 比對 \
print(re.findall("\\\\.", "ada\s123"))
print(re.findall(r"\\.", "ada\s123"))

# 結果如下
['\\s']
['\\s']      
  • ()分組
import re

print(re.findall("as+", "adassjkas"))   # 比對一次或多次 s
print(re.findall("(as)+", "adassjkas"))     # 比對一次或多次 as, 将 as 視為一個整體去比對

# 結果如下
['ass', 'as']
['as', 'as']      
  • | 或
print(re.findall("ad|2", "adad2"))

---> ['ad', 'ad', '2']      
  • ?P<alias>  設别名
import re

res = re.search("(?P<name1>w{3})\.(?P<name2>d(.*?)i)\.(?P<name3>cn)", "www.duoceshi.cn")
# ?P 對分組内容取名,<> 内的内容為名稱
print(res.group())
print(res.group("name1"))
print(res.group("name2"))
print(res.group("name3"))

# 結果如下
www.duoceshi.cn
www
duoceshi
cn      

2、re函數

  • re.findall()
    • 在字元串中找到正規表達式所比對的所有子串,并傳回一個清單,如果沒有找到比對的,則傳回空清單。 
import re

print(re.findall("\d","asd123adasd"))   #查找比對的數字

#結果如下
['1', '2', '3']      
  • re.search()
    • 掃描整個字元串并傳回第一個成功的比對對象 
    • group() 傳回對象結果
import re

print(re.search('www', 'www.duoceshi.com').span())  # 在起始位置比對
print(re.search('com', 'www.duoceshi.com').span())  # 不在起始位置比對
print(re.search('d.*i', 'www.duoceshi.com').group())

# 結果如下
(0, 3)
(13, 16)
duoceshi      
  • re.match()
    • 嘗試從字元串的起始位置比對第一個對象,如果不是起始位置比對成功的話,match()就傳回none。
      • group()  以str形式傳回對象中match的元素  
      • start()  傳回開始位置  
      • end()  傳回結束位置  
      • span()  以tuple形式傳回範圍  
import re
print(re.match('www', 'www.duoceshi.com').span())  # 在起始位置比對
print(re.match('www', 'www.duoceshi.com').start())  # 在起始位置比對
print(re.match('www', 'www.duoceshi.com').end())  # 在起始位置比對
print(re.match('www', 'www.duoceshi.com').group())  # 在起始位置比對
print(re.match('duo', 'www.duoceshi.com'))  # 不在在起始位置比對
print(re.match('com', 'www.duoceshi.com'))  # 不在在起始位置比對

#結果如下
(0, 3)
0
3
www
None
None      
  • re.split()
    • split 方法按照能夠比對的子串将字元串分割後傳回清單 
import re

print(re.split("ce", "duoceshi"))
print(re.split("[o, e]", "duoceshi"))
print(re.split("[d, o, e]", "duoceshi"))

# 結果如下
['duo', 'shi']
['du', 'c', 'shi']
['', 'u', 'c', 'shi']      
  • re.sub(pattern,repl,string,count=0,flags=0) 替換字元串中的比對項
    • pattern : 正則中的模式字元串。  
    • repl : 替換的字元串,也可為一個函數。
    • string : 要被查找替換的原始字元串。
    • count : 模式比對後替換的最大次數,預設 0 表示替換所有的比對。
import re

print(re.sub("...$", "cn", "www.duoceshi.com"))
print(re.sub("w..", "cn", "www.www.www", count=1))

---> www.duoceshi.cn
---> cn.www.www      
  • re.compile(pattern)  用于編譯正規表達式,生成一個正規表達式( Pattern )對象
import re

a = "www.taobao.com"
b = "www.jd.com"
c = "www.baidu.com"
cp = re.compile("\.(.+)\.")
print(cp.findall(a))
print(cp.findall(b))
print(cp.findall(c))

# 結果如下
['taobao']
['jd']
['baidu']      
  • re.finditer()  
    • 和 findall 類似,在字元串中找到正規表達式所比對的所有子串,并把它們作為一個疊代器傳回。  
import re

for i in re.finditer("\d","asd123adasd"):   #查找比對的數字
    print(i.group())

#結果如下
1
2
3      
模式 描述
^ 比對字元串的開頭
import re

print(re.findall("^t","python"))
print(re.findall("^p","python"))

#結果如下
[]
['p']      
$ 比對字元串的末尾。
import re

print(re.findall("t$","python"))
print(re.findall(".n$","python"))

#結果如下
[]
['on']      
. 比對任意字元,除了換行符,當re.DOTALL标記被指定時,則可以比對包括換行符的任意字元。
import re

print(re.findall(".","python"))
print(re.findall("t.","python"))    #比對t + 後面的任意字元

#結果如下
['p', 'y', 't', 'h', 'o', 'n']
['th']      
[...] 用來表示一組字元,單獨列出:[amk] 比對 'a','m'或'k'
import re

print(re.findall("a.","asd123adasd"))
print(re.findall("a..","asd123adasd"))
print(re.findall("a...","asd123adasd"))
print(re.findall("[^a]","asd123adasd"))

#結果如下
['as', 'ad', 'as']
['asd', 'ada']
['asd1', 'adas']
['s', 'd', '1', '2', '3', 'd', 's', 'd']      
[^...] 不在[]中的字元:[^abc] 比對除了a,b,c之外的字元。
import re

print(re.findall("[^th]","python")) #比對除 th 以外的所有字元

#結果如下
['p', 'y', 'o', 'n']      
re* 比對0個或多個的表達式。
re+ 比對1個或多個的表達式。
re? 比對0個或1個由前面的正規表達式定義的片段,非貪婪方式
re{ n} 精确比對 n 個前面表達式。例如, o{2} 不能比對 "Bob" 中的 "o",但是能比對 "food" 中的兩個 o。
re{ n,} 比對 n 個前面表達式。例如, o{2,} 不能比對"Bob"中的"o",但能比對 "foooood"中的所有 o。"o{1,}" 等價于 "o+"。"o{0,}" 則等價于 "o*"。
re{ n, m} 比對 n 到 m 次由前面的正規表達式定義的片段,貪婪方式
a| b 比對a或b
import re

print(re.findall("y|a","python")) #比對 y 或 a

#結果如下
['y']      
(re) 對正規表達式分組并記住比對的文本
(?imx) 正規表達式包含三種可選标志:i, m, 或 x 。隻影響括号中的區域。
(?-imx) 正規表達式關閉 i, m, 或 x 可選标志。隻影響括号中的區域。
(?: re) 類似 (...), 但是不表示一個組
(?imx: re) 在括号中使用i, m, 或 x 可選标志
(?-imx: re) 在括号中不使用i, m, 或 x 可選标志
(?#...) 注釋.
(?= re) 前向肯定界定符。如果所含正規表達式,以 ... 表示,在目前位置成功比對時成功,否則失敗。但一旦所含表達式已經嘗試,比對引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。
(?! re) 前向否定界定符。與肯定界定符相反;當所含表達式不能在字元串目前位置比對時成功
(?> re) 比對的獨立模式,省去回溯。
\w 比對字母數字及下劃線
\W 比對非字母數字及下劃線
\s 比對任意空白字元,等價于 [\t\n\r\f].
\S 比對任意非空字元
\d 比對任意數字,等價于 [0-9].
\D 比對任意非數字
\A 比對字元串開始
\Z 比對字元串結束,如果是存在換行,隻比對到換行前的結束字元串。
\z 比對字元串結束
\G 比對最後比對完成的位置。
\b 比對一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以比對"never" 中的 'er',但不能比對 "verb" 中的 'er'。
\B 比對非單詞邊界。'er\B' 能比對 "verb" 中的 'er',但不能比對 "never" 中的 'er'。
\n, \t, 等. 比對一個換行符。比對一個制表符。等
\1...\9 比對第n個分組的内容。
\10 比對第n個分組的内容,如果它經比對。否則指的是八進制字元碼的表達式。

參考:https://www.cnblogs.com/shenjianping/p/11647473.html

作者:多測師進階講師_鄭sir

微信:ZhengYing8887

出處:https://www.cnblogs.com/ZhengYing0813/

備注:本文版權歸作者所有,歡迎轉載和添加作者微信探讨技術,但未經作者同意必須在文章頁面給出原文連結,否則保留追究法律責任的權利。

繼續閱讀