python正則表達式詳解「電話號碼正則表達式語法」

通過前面的學習,我們知道了調用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似的,極簡之美環繞其周。

還有一個詞:求同存異

下面來看看正則表達式的語法:

正如上面所展示的,正則表達式由字符和操作符構成。Python爬蟲基礎之(四)正則表達式Re庫

常用操作符

來看一些經典的正則表達式例子:

^[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對象也有一些屬性和方法。Python爬蟲基礎之(四)正則表達式Re庫

Match對象的屬性Python爬蟲基礎之(四)正則表達式Re庫

Match對象的方法

前面已經介紹過如何調用對象的屬性和方法了,這裡就不再贅述,可以百度做深入了解。Python爬蟲基礎之(四)正則表達式Re庫

Re庫的六個基本方法

下面着重講解一下search方法:

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

在一個字符串中搜索匹配正則表達式的第一個位置,返回Match對象。

  • pattern:正則表達式的字符串或者原生字符串表示
  • string:帶匹配的字符串
  • flags:正則表達式使用時的控制標記

Python爬蟲基礎之(四)正則表達式Re庫

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’了。

那又有一個問題了,當我們想要輸出最短的子串該怎麼辦呢??

我們只需在操作符後面添加?即可輸出最小匹配了:Python爬蟲基礎之(四)正則表達式Re庫

最小匹配

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-08 15:18
下一篇 2024-12-08 15:18

相關推薦

發表回復

登錄後才能評論