通過前面的學習,我們知道了調用Requests庫可以爬取HTML頁面,調用Beautiful Soup庫可以解析HTML頁面。但是通常一個HTML頁面擁有非常多的信息,你總不能全部拿過來再手動修改吧,所以就需要使用Re正則表達式來提取頁面的關鍵信息。
正則表達式是什麼?
Re:Regular expression,可以簡潔、優雅的表達一組字符串的表達式。
舉個例子:
"Py"
"Pyt"
"Pyth"
"Pytho"
"Python"以上這組字符串有什麼相似之處呢?沒錯,就是它們都是以”Py”開頭的。
我們用了五行才把所有的字符串枚舉一遍,如果換成使用Re呢?一行OK!
Py(t|th|tho|thon)?N這只是五行字符串,如果是成千上萬行呢?那正則表達式用起來豈不是特別的爽。
“一行勝千言” — 正則表達式
正則表達式最最本質的特徵就是:簡潔、優雅、一行勝千言。
在我看來,就像是跟蘋果LOGO似的,極簡之美環繞其周。
還有一個詞:求同存異。
下面來看看正則表達式的語法:
正如上面所展示的,正則表達式由字符和操作符構成。
常用操作符
來看一些經典的正則表達式例子:
^[A-Za-z]+$ 由26個字母組成的字符串
^-?d+$ 整數形式的字符串
[1-9]d{5} 中國境內郵政編碼
d{3}-d{8}|d{4}-d{7} 國內電話號碼Python中的Re庫
Python為正則表達式提供了標準庫Re,用於匹配字符串。
調用Re庫:
import re正則表達式的表示類型:
- Re庫採用raw string類型表示正則表達式,形式為:r’text’。
例如:r'[1-9]d[5]’
raw string 類型是原生字符串類型,不能對轉義字符進行再次轉義。
- Re庫還可以採用string類型表示正則表達式,更為繁瑣,形式為’text’。
例如:'[1-9]\d{5}’
前一個”是轉義字符。
當正則表達式包含轉義字符時,更推薦使用raw string類型。
Re庫的基本方法:
先來介紹一下Match對象:
Match對象是一次匹配的結果,包含很多的匹配信息。
和response對象一樣,Match對象也有一些屬性和方法。
Match對象的屬性
Match對象的方法
前面已經介紹過如何調用對象的屬性和方法了,這裡就不再贅述,可以百度做深入了解。
Re庫的六個基本方法
下面着重講解一下search方法:
re.search(pattern, string, flags=0)在一個字符串中搜索匹配正則表達式的第一個位置,返回Match對象。
- pattern:正則表達式的字符串或者原生字符串表示
- string:帶匹配的字符串
- flags:正則表達式使用時的控制標記

flags標記取值
# 使用search方法匹配字符串
match = re.search(r'[1-9]d{5}', 'A100001', flags=re.I)
# 匹配成功則返回匹配後的字符串
if match:
print(match.group(0))注意:Match對象返回匹配結果,所以說Match返回值是bool型變量,故用條件語句判斷。
Re庫的方法使用起來並沒有太大的難度,下面給出剩餘方法總結:
re.match(pattern, string, flags=0)從一個字符串的開始位置起匹配正則表達式,返回Match對象。
參數同上。
re.findall(pattern, string, flags=0)搜索字符串,以列表類型返回全部能匹配的子串。
參數同上。
re.split(pattern, string, maxsplit=0, flags=0)將一個字符串按照正則表達式匹配結果進行分割,返回列表類型。
- maxsplit:最大分割數,剩餘部分作為最後一個元素輸出
re.finditer(pattern, string, flags=0)搜索字符串,返回一個匹配結果的迭代類型,每個迭代元素都是Match對象。
參數同上。
for m in re.finditer(r'[1-9]d{5}', 'A100001 B100002'):
if m:
print(m.group(0))re.sub(pattern, repl, string, count=0, flags=0)在一個字符串中替換所有匹配正則表達式的子串,返回替換後的字符串。
- repl:替換匹配字符串的字符串
- count:匹配的最大替換次數
sub = re.sub(r'[1-9]d{5}', ',hello', 'A100001 B100002')
print(sub)Re庫的等價用法
上面講解了Re庫六種基本方法的函數式用法,下面介紹另一種等價的面向對象的用法:
match = re.search(r'[1-9]d{5}', 'A100001')cmp = re.compile(r'[1-9]d{5}')
match = cmp.search('A100001')第一種是函數式用法,一次操作可以完成任務;第二種是面向對象用法,先將正則表達式的字符串形式編譯成正則表達式對象,再進行方法操作。兩種方法都是可以的,了解即可。
Re庫的貪婪匹配機制
在實際使用過程中,我們會遇上一個問題,如下:
match = re.search(r'PY.*N', 'PYANBNCN')對這樣一個字符串,原則上是可以返回三個子串,即’PYAN’,’PYANBN’,’PYANBNCN’。但是我們調用match.group(0)查看時,該返回哪一個呢?
Re庫默認採用貪婪匹配機制,返回匹配中最長的子串,也就是返回’PYANBNCN’了。
那又有一個問題了,當我們想要輸出最短的子串該怎麼辦呢??
我們只需在操作符後面添加?即可輸出最小匹配了:
最小匹配
match = re.search(r'PY.*?N', 'PYANBNCN')
if match:
print(match.group(0))小結
本章講解了Python中正則表達式Re庫的入門級使用,正則表達式並不是Python所獨有的,很多地方都可以使用,在學習完Re庫後對其他語言和任務也都有一定的幫助。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/208632.html
微信掃一掃
支付寶掃一掃