Python學習筆記|Python之正規表示式

Tester_hope發表於2018-12-18

什麼是正規表示式

正規表示式是包含文字和特殊字元的字串,該字串描述一個可以識別各種字串的模式

1.字元

1.1 正規表示式對字元(單個字元)的表示
  • .

匹配任意1個字元(除了\n),注意因為.表示任意一個字元,所以如果匹配‘.’則需要用轉義字元.來表示

程式碼如下:

	print(re.findall('.',"s2a4561b3678 ——"))

結果如下:

	['s', '2', 'a', '4', '5', '6', '1', 'b', '3', '6', '7', '8', ' ', '—', '—']
  • [ ]

匹配[ ]中列舉的字元,如果[a-zA-Z0-9],[a-zA-Z]表示所有字母和數字,後者表示所有字母,注意中間沒有空格符號。

  • \d

匹配數字,即0-9

程式碼如下:

	print(re.findall('\d',"s2a4561b3678 ——"))

結果為:

	['2', '4', '5', '6', '1', '3', '6', '7', '8']
  • \D

匹配非數字,即不是數字

程式碼如下:

	print(re.findall('\D',"s2a4561b3678 ——"))

結果如下:

	['s', 'a', 'b', ' ', '—', '—']
  • \s

匹配空白,即 空格,tab鍵

程式碼如下:

	print(re.findall('\s',"s2a4561b3678 ——"))

結果如下:

	[' ']
  • \S

匹配非空白

程式碼如下:

	print(re.findall('\S',"s2a4561b3678 ——"))

結果如下:

	['s', '2', 'a', '4', '5', '6', '1', 'b', '3', '6', '7', '8', '—', '—']
  • \w

匹配單詞字元,即a-z、A-Z、0-9、_

程式碼如下:

	print(re.findall('\w',"s2a4561b3678 ——"))

結果如下:

	['s', '2', 'a', '4', '5', '6', '1', 'b', '3', '6', '7', '8']
  • \W

匹配非單詞字元

程式碼如下:

	print(re.findall('\W',"s2a4561b3678 ——"))

結果如下:

	[' ', '—', '—']
1.2 正規表示式匹配多個字元:數量的表示
	text = "a aAx aAAy bAAz cAAAk"
  • * 匹配前一個字元出現0次或者無限次,即可有可無
	print(re.findall(r"aA*", text))     #['a', 'aA', 'aAA']
  • + 匹配前一個字元出現1次或者無限次,即至少有1次
	print(re.findall(r"aA+", text)) #['aA', 'aAA']
  • ? 匹配前一個字元出現1次或者0次,即要麼有1次,要麼沒有
	print(re.findall(r"aA?", text))  #['a', 'aA', 'aA']
  • {m} 匹配前一個字元出現m次
	print(re.findall(r"A{2}",text)) #['AA', 'AA', 'AA']
  • {m,} 匹配前一個字元至少出現m次
	print(re.findall(r"A{1,}",text)) #['A', 'AA', 'AA', 'AAA']
  • {m,n} 匹配前一個字元出現從m到n次
	print(re.findall(r"A{1,2}",text))#['A', 'AA', 'AA', 'AA', 'A']
1.3 正規表示式:匹配邊界的問題
  • ^ 匹配字串開頭
	print(re.findall('^s',"s2a4561b3678 ——"))

結果為:

	['s']
  • $ 匹配字串結尾
	print(re.findall('8$',"s2a4561b3678"))

結果為:

	['8']
  • \b

匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。

	print(re.findall(r'\bs',"s2abc4561b3678 ——"))
	['s']
  • \B 匹配非單詞邊界,‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
	print(re.findall(r'\babc\b',"abc4561b3678 ——abc"))

結果為:

	['abc']

2.re模組中常用的功能函式

首先了解下flags值的含義,具體如下:

  • re.S(DOTALL)

使.匹配包括換行在內的所有字元

  • re.I(IGNORECASE)

使匹配對大小寫不敏感

  • re.L(LOCALE)

做本地化識別(locale-aware)匹配,法語等

  • re.M(MULTILINE)

多行匹配,影響^和$

  • re.X(VERBOSE)

該標誌通過給予更靈活的格式以便將正規表示式寫得更易於理解

  • re.U

根據Unicode字符集解析字元,這個標誌影響\w,\W,\b,\B

2.1 compile()
  • 函式原型

生成一個正規表示式物件,供 match() 和 search() 這兩個函式使用

	re.compile(pattern,flags=0)
2.2 serach()
  • 函式原型

整個字串中匹配

	re.search(pattern, string, flags=0)

如下:

	print(re.search('com', 'www.baidu.com'))
2.3 match()
  • 函式原型
	re.match(pattern, string, flags=0)

match匹配,如果匹配成功,則返回一個match object的match物件

print(re.match('www', 'www.baidu.com')) # 在起始位置匹配

如果不是起始位置匹配成功的話,match()就返回None

print(re.match('com', 'www.baidu.com')) # 不在起始位置匹配
  • 總結

match與search區別
1.re.match只匹配字串的開始,如果字串開始不符合正規表示式,則匹配失敗,函式返回None
2.re.search匹配整個字串,直到找到一個匹配。

2.4 findall()
  • 函式原型

findall字串中找到正規表示式所匹配的所有子串,並返回一個列表

	re.findall(pattern, string, flags=0)
2.5 finditer()
  • 函式原型

finditer字串中找到正規表示式所匹配的所有子串,並把它們作為一個迭代器返回

	re.finditer(pattern, string, flags=0)
2.6 split()
  • 函式原型

split將字串按照正規表示式分隔,返回一個列表

	re.split(pattern, string[, maxsplit])
2.7 sub()
  • 函式原型

sub用於替換字串中的匹配項,將字串根據正規表示式用引數二替換,返回一個替換後的字串

	re.sub(pattern, repl, string, count)
2.8 subn()
  • 函式原型

subn返回替換個數,並以元組形式返回(字串,替換個數)

	subn(pattern, repl, string, count=0, flags=0)

3.match object中的方法

match和search一旦匹配成功,就是一個match object物件,而match object物件有以下方法:

3.1 groups()

返回被 RE 匹配的字串

3.2 start()

返回匹配開始的位置

3.3 end()

返回匹配結束的位置

3.4 span()

返回一個元組包含匹配 (開始,結束) 的位置

3.5 group()

返回re整體匹配的字串,可以一次輸入多個組號,對應組號匹配的字串。

4.貪婪匹配與非貪婪匹配

  • 非貪婪模式

在整個表示式匹配成功的前提下,儘可能少的匹配,量詞後面直接加上一個問號”?”就變成了飛非貪婪,具體量詞有5個,分別為:*,+,?,{m},{n,m}

	a = re.findall(r"a(\d+?)",'a23ba23')
	print(a)
  • 貪婪匹配

正規表示式一般趨向於最大長度匹配,也就是所謂的貪婪匹配,python中預設採用的是貪婪模式

	b = re.findall(r"a(\d+)",'a23ba23')
	print(b)

相關文章