前言

首先要明白什麼是正則表達式?

正則表達式又稱規則表達式,是對字元串操作的一種邏輯公式,就是用事先定義好的一些特定字元及這些特定字元的組合,組成一個「規則字元串「,這個」規則「用來表達對字元串的一種過濾邏輯。通俗講就是給定一個規則(模式),然後根據這個規則去匹配文本。

常見的匹配模式

ps:上下滑動查看更多,高清原照後臺回復:正則

查看re模塊的功能信息

import re
print(re.__doc__)

re的主要功能函數

常用的功能函數包括:

compile、search、match、split、findall(finditer)、sub(subn)、escape等等。

re.match

re.match 嘗試從字元串的起始位置匹配一個模式,如果不是起始位置就匹配成功的話,match()就返回None,即它返回從位置 0 開始有匹配的情況。

這個方法並不是完全匹配。當pattern結束時若string還有剩餘字元,仍然視為成功。想要完全匹配,可以在表達式末尾加上邊界匹配符$

語法格式:

re.match(pattern, string[, flags])

flags: 編譯標誌位,用於修改正則表達式的匹配方式,如:是否區分大小寫,多行匹配等。

編譯標誌:
  • re.S(DOTALL) 使.匹配包括換行在內的所有字元
  • re.I(IGNORECASE) 使匹配對大小寫不敏感
  • re.L(LOCALE) 做本地化識別(locale-aware)匹配,法語等,即讓w、W、、B、s和S依賴當前的locale。
  • re.M(MULTILINE) 多行匹配,影響^和$
  • re.X(VERBOSE) 該標誌通過給予更靈活的格式以便將正則表達式寫得更易於理解,即可以在規則中加#注釋
  • re.U 根據Unicode字符集解析字元,這個標誌影響w,W,,B

示例:

import re

string = hello world!! 123 ABC $9.99 +feg
result = re.match(world,string)
print(result)

None
import re

string = hello world!! 123 ABC $9.99 +feg
result1 = re.match(he.*!!s(d{2}).*B,string) # 貪婪匹配
print(result1)
print(result1.group())
print(result1.group(1))

result2 = re.match(he.*?!!sd{3}swwws$d.dd,string) # 非貪婪匹配: .任意字元 *零到多次 ?非貪婪
print(result2)
print(result2.group())

<_sre.SRE_Match object; span=(0, 20), match=hello world!! 123 AB>
hello world!! 123 AB12
<_sre.SRE_Match object; span=(0, 27), match=hello world!! 123 ABC $9.99>
hello world!! 123 ABC $9.99

re.search

re.search 掃描整個字元串並返回第一個成功的匹配,如果沒有匹配的就返回None。

語法格式:

re.search(pattern, string[, flags])

示例:

import re

string = hello world!! 123 ABC $9.99 +feg
result = re.search(!!s(d{2}).*?(BC).*?.(d+).*?f(w)+,string) # 貪婪匹配 #註:(w)+只匹配最後一個字母g
print(result)
print(result.group())
print(result.group(2))
print(result.group(1,2,3))
print(result.groups())

<_sre.SRE_Match object; span=(11, 32), match=!! 123 ABC $9.99 +feg>
!! 123 ABC $9.99 +feg
BC
(12, BC, 99)
(12, BC, 99, g)

小結:為匹配方便,盡量用search而不用match

re.findall

搜索字元串,以列表形式返回全部能匹配的子串。

語法格式:

re.findall(pattern, string[, flags])

示例:

import re
string =
<ul id="list" class="list-group">
<li>哈哈哈哈</li>
<li data-view="1">
<a href="/1.com" singer="one">123456789</a>
</li>
<li data-view="2" class="active">
<a href="/2.com" singer="two">abc</a>
</li>
<li data-view="3"><a href="/4.com" singer="three">ABCDEF</a></li>
<li data-view="4"><a href="/5.com" singer="four">000000</a></li>
</ul>

results = re.findall(<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>, string, re.S)
print(results)
for result in results:
print(result)
print(result[0], result[1], result[2]))

re.finditer

與 findall 類似,在字元串中找到正則表達式所匹配的所有子串,並組成一個迭代器返回。

語法格式:

re.finditer(pattern, string[, flags])

re.sub

在字元串 string 中找到匹配正則表達式 pattern 的所有子串,用另一個字元串 repl 進行替換。如果沒有找到匹配 pattern 的串,則返回未被修改的 string。Repl 既可以是字元串也可以是一個函數。

語法格式:

re.sub(pattern, repl, string[, count, flags])
re.subn(pattern, repl, string[, count, flags]) 返回內容包括替換次數

示例:

import re

string = hello world!! 123 ABC $9.99 +feg
result1 = re.sub(d+, 換, string)
print(result1)
result2 = re.sub(d, 換, string)
print(result2)
result3 = re.sub((d+), r1換, string) #模式處追加
print(result3)

hello world!! 換 ABC $換.換 +feg
hello world!! 換換換 ABC $換.換換 +feg
hello world!! 123換 ABC $9換.99換 +feg

註:零長度的匹配也會被替換

re.split

語法格式:

re.split(pattern, string[, maxsplit=0, flags=0])

將字元串匹配正則表達式的部分割開,並返回一個列表。

用匹配pattern的子串來分割string,如果pattern裏使用了圓括弧,那麼被pattern匹配到的串也將作為返回值列表的一部分。如果maxsplit不為0,則最多被分割為maxsplit個子串,剩餘部分將整個地被返回。

如果正則有圓括弧,並且可以匹配到字元串的開始位置的時候,返回值的第一項,會多出一個空字元串。匹配到字元結尾也是同樣的道理

註:split不會被零長度的正則所分割。

示例:

import re

string = A-B-C-D-F-G
print(re.split(r-,string))
print(re.split(r(-),string))
print(re.split(r-,string,1))
print(re.split(r-,string,2))
print(re.split(r(-),string,2))

[A, B, C, D, F, G]
[A, -, B, -, C, -, D, -, F, -, G]
[A, B-C-D-F-G]
[A, B, C-D-F-G]
[A, -, B, -, C-D-F-G]

re.escape

把string中,除了字母和數字以外的字元,都加上反斜桿。

示例:

import re

string = 123 A - B @ C 456 # D % F (G) 789*
print(re.escape(string))

123 A - B @ C 456 # D \% F (G) 789*

re.escape

把正則表達式語法轉化成正則表達式對象,以便於復用該匹配模式

語法格式:

re.compile(pattern[, flags])

示例:

import re

string = haha 123 world is cool
pattern = re.compile(ha.*cool)
result = re.match(pattern, string)
print(result)
print(result.group())

<_sre.SRE_Match object; span=(0, 22), match=haha 123 world is cool>
haha 123 world is cool
content = haha 123 world is cool123456789 I am a haha,what?
666 haha 123 world is cool euiujkldmfhgfg85df5hg5j6fg6h8
tycv haha 123 world is coolsgsreg19---41f351**165sd

r_m = re.match(pattern, content)
print(r_m.group())

r_s = re.search(pattern,content)
print(r_s.group())

r_f = re.findall(pattern,content)
print(r_f)

r_fter = re.finditer(pattern,content)
print(r_fter)

haha 123 world is cool
haha 123 world is cool
[haha 123 world is cool, haha 123 world is cool, haha 123 world is cool]
<callable_iterator object at 0x7fb03ceca160>

薦讀:

urllib的基本用法

urllib3的基本用法

requests的基本使用


推薦閱讀:
相關文章