三十一、深入Python中的正則表達式

2022-01-10 Python之王

「@Author:Runsen」

正則表達式應用的場景也非常多。常見的比如:搜尋引擎的搜索、爬蟲結果的匹配、文本數據的提取等等都會用到,所以掌握甚至精通正則表達式是一個硬性技能,非常必要。

正則表達式

正則表達式是一個特殊的字符序列,由普通字符和元字符組成。元字符能幫助你方便的檢查一個字符串是否與某種模式匹配。

Python中則提供了強大的正則表達式處理模塊,即 re 模塊, 為Python的內置模塊。

下面,我帶大家來一個入門demo例子,代碼如下:

import re
reg_string = "hello9527python@wangcai.@!:xiaoqiang"
reg = "hello"
result = re.findall(reg,reg_string)
print(result)

這裡reg_string就是我們的普通字符,reg就是我們的元字符。

我們使用 re 模塊中的findall函數,進行匹配,返回的結果是列表數據類型。

我們使用正則表達式,就是為了在很長的字符串中,找到我們需要的字符串片段。

元字符

Python中常見元字符及其含義如下:

元字符含義.匹配除換行符以外的任意字符\w匹配數字字母下劃線漢字\s匹配任意空白符\d匹配所有的數字\b匹配單詞的開始或結束^匹配字符串的開始$匹配字符串的開始結束

下面,我們具體使用下Python中的常見的元字符。

我們還是使用上次的例子,這次我們需要在reg_string匹配出我們的數字,只需要將reg換成\d,代碼如下圖所示。

比如,我們在之前的reg的hello前面加上一個^,意味著我們 匹配字符串的開始的hello,那麼結果就是一個,就是我們開頭的hello。

如果,我們把reg換成\w,代碼如下圖所示。

這樣就是匹配數字字母下劃線,包括我們的漢字。

反義代碼

Python中常見反義代碼 及其含義如下:

反義代碼含義\W匹配任意不是數字字母下劃線漢字的字符\S匹配任意不是空白符的字符\D匹配非數字\B匹配不是單詞的開始或結束[^a]匹配除了a以外的任意字符[^abcd]匹配除了abcd以外的任意字符

其實,記憶很簡單,我們是不是知道\d匹配數字,那麼\d的大寫\D就是匹配非數字,元字符[a]匹配a任意字符,那麼[^a]就是匹配除了a以外的任意字符。

下面是具體例子

>>> import re
>>> reg_string = "hello9527python@wangcai.@!:xiaoqiang"
>>> reg = "\D"
>>> re.findall(reg,reg_string)
['h', 'e', 'l', 'l', 'o', 'p', 'y', 't', 'h', 'o', 'n', '@', 'w', 'a', 'n', 'g', 'c', 'a', 'i', '.', '@', '!', ':', 'x', 'i', 'a', 'o', 'q', 'i', 'a', 'n', 'g']
>>> reg = "[^a-p]"
['9', '5', '2', '7', 'y', 't', '@', 'w', '.', '@', '!', ':', 'x', 'q']

限定符

什麼是限定符?就是限定我們匹配的個數的東西。

Python中常見限定符 及其含義如下:

限定符含義*重複零次或多次+重複一次或多次?重複零次或一次{n}重複n次{n,}重複n次或更多次{n,m}重複n次到m次 {1,3}

我們還是用我們之前的reg_string,這次我們限定了元字符為\d{4},也就是我們的匹配的數字必須是4個。

下面,我們來提高難度,匹配字母和數字,限定個數為4個。

這樣我們可以使用[0-9a-z]{4},作為我們的元字符,[0-9a-z]代表了0到9的十個數字和a到z的小寫26個英文字母。[0-9a-z]{4}限定了個數為4個。

我們列印輸出下。

如果遇到了不是在[0-9a-z]範圍內,就會跳過,直到後面的4個都是在[0-9a-z]範圍內就列印輸出。

匹配ip地址

在網際網路中,一臺主機只有一個IP位址。IP位址用於在TCP/IP通信協議中標記每臺計算機的地址,通常用於十進位來表示,如192.168.1.100。

在window系統中,我們可以通過ipconfig查看我們的ip。在linux系統中,我們可以通過ifconfig查看我們的ip。

我們的ip字符串是這樣子的:ip = "this is ip:192.168.1.123 :172.138.2.15"

下面要求使用正則表達式,將ip匹配出來。

其實,我們主要編寫元字符。比如:reg = "\d{3}.\d+.\d+.\d+",因為第一個數字必須是三位數開頭,我們可以設定\d{3}固定起來。

我們除了可以使用findall,還可以使用search,我們把元字符reg = "(\d{1,3}.){3}\d{1,3}"。

這元字符中的\d{1,3}.指定是我們ip前三個數字,後面加{3}就是重複3次。\d{1,3}指的就是我們ip最後一個數字。

但是search和findall是有區別的,search只能匹配第一個,我們需要使用列表取出第一個,而findall匹配所有。

組匹配

什麼是組匹配,比如說這裡邊我有一個字符串s = this is phone:13888888888 and this is my postcode:012345,我需要你把手機號和驗證碼匹配出來。

因為,我們要匹配兩個,而已每個的元字符都是不一樣的。所以,我們需要分組匹配。

正則表達式的括號表示分組匹配,括號中的模式可以用來匹配分組的內容。

於是我們的元字符就變成:reg = this is phone:(\d{11}) and this is my postcode:(\d{6})

我們一般使用search進行分組匹配,上次我是不是說過search需要使用列表取出來,這裡的組匹配也是一樣,不過這裡用的是group()方法。group(1)代表了我們的手機號,group(2)代表了我們的驗證碼,而group(0)代表了我們的手機號和驗證碼,代碼如下圖所示。

在正則表達式中,除了findall和search用法,還有一個match用法。

match用法只匹配開頭的,也是需要group()取出來,下圖match的例子。

這是的re.I是忽略大小寫的意思。

貪婪與非貪婪

貪婪與非貪婪模式影響的是被量詞修飾的子表達式的匹配行為,貪婪模式在整個表達式匹配成功的前提下,儘可能多的匹配,而非貪婪模式在整個表達式匹配成功的前提下,儘可能少的匹配。

貪婪和非貪婪有幾個非常重要的操作符。

操作符含義*重複零次或更多次+重複一次或更多次?重複零次或一次

比如說這裡邊我有一個字符串reg_string = pythonnnnnnnnnpythonHelloPytho,我們先使用貪婪的模式下的元字符:reg = "python*"

貪婪模式下的reg = "python*",意味著n重複零次或更多次。所以我們看到了第一關結果的pythonnnnnnnnn儘可能多的匹配。

下面使用非貪婪的模式下的元字符:reg = "python*?",reg = "python+?",reg = "python??"。

非貪婪模式下的reg = "python*",意味著n零次或一次,所以我們沒有看到pythonnnnnnnnn的結果。

手機號碼驗證

首先,我們要知道我們的手機號碼是什麼開頭的?

移動手機號碼開頭有16個號段:134、135、136、137、138、139、147、150、151、152、157、158、159、182、187、188。

聯通手機號碼開頭有7種號段:130、131、132、155、156、185、186。

電信手機號碼開頭有4個號段:133、153、180、189。

這樣我們就可以在開頭做事情了,先判斷開頭是不是上面的號段,regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$",就是我們的元字符,代碼如下:

import re

def checkCellphone(cellphone):
    regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$"
    result = re.findall(regex,cellphone)
    if result:
        print("匹配成功")
        return True
    else:
        print("匹配失敗")
        return False
cellphone = '13717378202'
checkCellphone(cellphone)


匹配成功
True

匹配郵箱合法性

下面,我們進行一個作業,就是來匹配我們的郵箱號碼。

作業的答案如下:


import re

def checkEmail(email):

    regex_1 = '^(\w+)@sina.com$'
    regex_2 = '^(\w+)@sina.com.cn$'
    regex_3 = '^(\w+)@163.com$'
    regex_4 = '^(\w+)@126.com$'
    regex_5 = '^[1-9][0,9]{4,}+@qq.com$'
    regex = [regex_1 ,regex_2 ,regex_3, regex_4, regex_5]
    for i in  regex:
        result = re.findall(i,email)
        if result:
            print("匹配成功")
            return True
        else:
            print("匹配失敗")
            return False
email = 'sdjflsdjkl@sina.com'
checkEmail(email)

正則表達式測試工具

打開開源中國提供的正則表達式測試工具 http://tool.oschina.net/regex/,輸入待匹配的文本,然後選擇常用的正則表達式,就可以得出相應的匹配結果了。

例如,輸入下面這段待匹配的文本:

Hello, my phone number is 123455678 and email is runsen@qq.com, and my website is https://blog.csdn.net/weixin_44510615.

這段字符串中包含了一個電話號碼和一個電子郵件,接下來就嘗試用正則表達式提取出來,如圖所示。

在網頁右側選擇 「匹配 Email 地址」,就可以看到下方出現了文本中的 E-mail。如果選擇 「匹配網址 URL」,就可以看到下方出現了文本中的 URL。是不是非常神奇?

本文已收錄 GitHub,傳送門~[1] ,裡面更有大廠面試完整考點,歡迎 Star。


相關焦點

  • Python 正則表達式
    最簡單的正則表達式就是普通字符串,可以匹配其自身。比如,正則表達式 『hello』 可以匹配字符串 『hello』。要注意的是,正則表達式並不是一個程序,而是用於處理字符串的一種模式,如果你想用它來處理字符串,就必須使用支持正則表達式的工具,比如 Linux 中的 awk, sed, grep,或者程式語言 Perl, Python, Java 等等。
  • Python正則表達式總結
    正則表達式 的起源、發展、流派、語法、引擎、優化等相關知識,今天我們主要來學習一下 正則表達式在 Python語言 中的應用!大多數程式語言的正則表達式設計都師從Perl,所以語法基本相似,不同的是每種語言都有自己的函數去支持正則,今天我們就來學習 Python中關於 正則表達式的函數。re模塊主要定義了9個常量、12個函數、1個異常,每個常量和函數豬哥都會通過實際代碼案例講解,讓大家能更直觀的了解其作用!註:為避免出現代碼格式錯亂,豬哥儘量使用代碼截圖演示哦。
  • 萬字長文詳解Python正則表達式及re模塊
    這些都是正則表達式的運用。但是如果想查到一組限定的字符,比較原音字母(a, e, i, o, u),特殊字符(*, &, %, @)這怎麼弄呢?在正則表達式中使用[]將一組字符包裹起來,就到達了自己的需要,例如原音字符[aeiou],特殊字符[*&%@]即可完美的匹配任意一個!
  • 妙用正則表達式--Python中的re模塊
    Python中的re模塊可以方便地引入正則表達式。利用正則表達式,我們可以對文本內容進行精確快捷地匹配和提取。與Stata相比,正則表達式的元字符是通用的,不同的是函數。re庫中有若干個函數各司其職,在上一篇推文《Python標準庫re:正則表達式》中我們介紹了re庫中的三個常用函數,現在小編將從實用的角度再介紹幾個常用的函數。
  • python正則表達式
    微信公眾號:學點啥玩點啥小白友好型python正則表達式 1#第7章 模式匹配與正則表達式
  • Python中正則表達式模塊詳解
    用來處理字符串,對字符串進行檢索和替換,另外正則在python爬蟲的應用也是相當廣泛!
  • 學習Python正則表達式
    然而,讓李丹煩惱的是,評論是以自由文本的形式展現,電話號碼就在這些評論中。如何不需要一個接一個地複製和粘貼,就可以輕鬆地找到這些電話號碼?Python中的正則表達式(re)就可以解決這個問題!正則表達式正則表達式是一個具有特殊字符的序列。它有助於檢查字符串中的每個字符,看它是否與某個模式匹配:哪些字符在什麼位置出現了多少次。
  • 原創通俗易懂的Python的正則表達式,建議收藏
    正則表達式正則表達式是一個特殊的字符序列,由普通字符和元字符組成。元字符能幫助你方便的檢查一個字符串是否與某種模式匹配。正則表達式應用的場景也非常多。常見的比如:搜尋引擎的搜索、爬蟲結果的匹配、文本數據的提取等等都會用到,所以掌握甚至精通正則表達式是一個硬性技能,非常必要。
  • Python中的正則表達式
    什麼是正則表達式正則表達式是用於處理字符串的強大工具,它使用預定義的特定模式去匹配一類具有共同特徵的字符串,主要用於快速、準確地完成複雜字符串的查找、替換等。正則表達式進行匹配的流程如下圖所示:正則表達式匹配過程是:依次拿出表達式和文本中的字符比較,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
  • 強勢來襲,Python爬蟲之正則表達式!
    我們的《從零開始學爬蟲》專欄發布後,目前已經更新了三篇:今天我們來介紹一個在爬蟲中非常重要的工具:正則表達式。正則表達式是一個特殊的符號系列,它能夠幫助開發人員檢查一個字符串是否與某種模式匹配。本篇文章涉及以下內容:正則表達:學會正則表達式的常用符號。
  • Python正則表達式:特殊符號和字符
    正表達式為高級的文本模式匹配,抽取,與/或文本形式的搜索和替換功能提供了基礎。簡而言之,正則表達式(簡稱regex)是由一些字符和特殊符號組成的字符串,它描述了模式的重複或者表達多個字符。python通過標準庫中的re模塊來支持正則表達式。
  • python腳本練習(2):使用正則表達式的三部曲
    你可以在google上搜索regex或者regexp獲得非常多的學習資料。這篇短文介紹在python腳本中使用正則表達式的步驟:1、導入re模塊Python中所有正則表達式的函數都在re模塊中,可以在交互式環境或者腳本文件中輸入以下代碼。
  • Python3爬蟲(4)--python正則表達式詳細版
    等等,在python中,這些都可以用正則表達式處理函數進行處理。re 模塊使 Python 語言擁有全部的正則表達式功能。使用前導入該模塊:import re1、re.match()函數和re.search()函數,實現字符串的正則匹配match 和 search 只匹配一次,當正則表達式在字符串中匹配到多個結果時,在不指定全部返回的情況下,只返回最先匹配到的第一個結果。
  • 熬夜到虛脫整理出來的Python的正則表達式總結
    本文連結:https://blog.csdn.net/weixin_46654114/article/details/117574855一. python正則表達式介紹正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。Python 自1.5版本起增加了re 模塊,它提供 Perl 風格的正則表達式模式。
  • Python正則表達式,這一篇就夠了!
    大多數程式語言的正則表達式設計都師從Perl,所以語法基本相似,不同的是每種語言都有自己的函數去支持正則,今天我們就來學習 Python中關於 正則表達式的函數。re模塊主要定義了9個常量、12個函數、1個異常,每個常量和函數豬哥都會通過實際代碼案例講解,讓大家能更直觀的了解其作用!註:為避免出現代碼格式錯亂,豬哥儘量使用代碼截圖演示哦。
  • 站長在線Python精講:在Python中使用正則表達式的split()方法分割字符串詳解
    收錄於話題 #python 歡迎你來到站長在線的站長學堂學習Python知識,本文學習的是《在Python中使用正則表達式的split()方法分割字符串詳解》。
  • 給零基礎正在學Python的小白寫的正則表達式!
    正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。在很多文本編輯器裡,正則表達式通常被用來檢索、替換那些匹配某個模式的文本。
  • Python正則表達式入門到入魔
    ,很多人認為,使用的時候查詢下就可以,沒必要深入學習,但是知識與應用永遠都是螺旋辯證的關係,有需要查詢也無可厚非,但是先掌握知識,可以讓應用更創新,更深入,超越他人,必須要先掌握大量的深刻的知識。=:)','http://blog.csdn.net/mhmyqn')['http']'''分析:URL地址中協議部分是在:之前的部分,模式.+匹配任意文本,子表達式(?=:)匹配:,但是被匹配到的:並沒有出現在結果中。我們使用?=向正則表達式引擎表明,只要找到:就行了,但不包括在最終的返回結果裡。這裡如果不使用向前匹配(?
  • [Python]進階⁽⁵¹⁾|正則表達式
    T51:Python 正則表達式在此篇教程中,你將學習正則表達式(RegEx
  • Python 正則表達式之 re 模塊
    我是風一,最近經常需要對字符串數據進行處理;為了便於快速處理與查詢;這裡對 Python 正則表達式進行複習,正則表達式是一個特殊的字符序列,它能幫助方便的檢查一個字符串是否與某種模式匹配;文章主要分為兩大類、常用的re模塊函數以及正則表達式的模式,那麼就開始吧!