欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python正則表達式急速入門(小結(jié))

 更新時間:2019年12月16日 10:46:56   作者:朱鋼  
這篇文章主要介紹了Python正則表達式急速入門(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

正則表達式在程序開發(fā)中會經(jīng)常用到,比如數(shù)據(jù)(格式)驗證、替換字符內(nèi)容以及提取字符串內(nèi)容等等情況都會用到,但是目前許多開發(fā)人員對于正則表達式只是處于了解或者是基本會用的階段。一旦遇到大批量使用正則表達式的情況(例如網(wǎng)絡(luò)爬蟲)可以說基本上就抓瞎了。這篇文章我將帶領(lǐng)大家利用 Python 來學(xué)習(xí)一下正則表達式。在閱讀這篇文章前你需要掌握 Python 基礎(chǔ)知識,或者具有其他開發(fā)語言的基礎(chǔ)知識也可以,因為基本上每種語言使用正則表達式的方式都是類似的。

零、正則表達式基礎(chǔ)

1.提取字符(串) 有時我們需要從一個字符串中獲取一段內(nèi)容,這段內(nèi)容可能是一個字符也可能是一段字符串,如果用逐字對比遍歷的話不僅耗時耗力而且還容易出錯。那么這個時候我們就可以用到正則表達式中的 字符匹配 功能。正則表達式為我們提供了 4 種字符匹配的方法,見下表:

語法 說明 例子 可匹配字符串
. 匹配除了換行符 “\n” 以外的任意字符 a.b acb、adb、a2b、a~b
\ 轉(zhuǎn)義,將轉(zhuǎn)移字符后面的一個字符改變原來的意思 a[b\.\\]c abc、a.c、a\c
[] 匹配括號內(nèi)的任意字符 a[b,c,d,e]f abd、acf、adf、aef
[^] 除了括號內(nèi)的字符外,其他的字符都匹配 aa,b,c,d,ef a1f、a#f、azf、agf

2.預(yù)定義字符 所謂預(yù)定義字符就是正則表達式中為我們預(yù)留的專門用來匹配格式化內(nèi)容的字符,例如匹配數(shù)字用的 \d 和匹配空白符的 \s 等等。我們可以利用預(yù)定義字符快速的匹配出一個字符串中符合要求的內(nèi)容。預(yù)定義字符匹配的內(nèi)容,同樣也可以利用前面所講的字符匹配的方式匹配出來,但是代碼量會相對來說多一點。下表所列的就是預(yù)定義字符:

語法 說明 例子 可匹配字符串
^ 以什么字符串開始 ^123 123abc、123321、123zxc
$ 以什么字符串結(jié)尾 123$ abc123、321123、zxc123
\b 匹配單詞邊界,不匹配任何字符 \basd\b asd
\d 匹配數(shù)字0-9 zx\dc zx1c、zx2c、zx5c
\D 匹配非數(shù)字 zx\Dc zxvc、zx$c、zx&c
\s 匹配空白符 zx\sc zx c
\S 匹配非空白符 zx\Sc zxac、zx1c、zxtc
\w 匹配字母、數(shù)字和下劃線 zx\wc zxdc、zx1c、zx_c
\W 匹配非字母、數(shù)字和下劃線 zx\Wc zx c、zx$c、zx(c

在預(yù)定義字符中有如下幾點需要注意:

  • \b 匹配的只是一個位置,這個位置的一側(cè)是構(gòu)成單詞的字符,另一側(cè)為非單詞字符、字符串的開始或結(jié)束位置。\b 是零寬度。
  • \w 在不同編碼語言中匹配的范圍是不一樣的,在使用 ASCII 碼的語言中匹配的是 [a-zA-Z0-9] ,而在使用 Unicode 碼的語言中匹配的是 [a-zA-Z0-9] 和漢字、全角符號等特殊字符。

3.限制數(shù)量 在某些情況下我們需要匹配重復(fù)的內(nèi)容,這時我們可以使用 數(shù)量限定 模式來進行操作。數(shù)量限定如下表: 

語法 說明 例子 可匹配字符串
* 匹配0到多次 zxc* zx、zxccccc
+ 匹配1次到多次 zxc+ zxc、zxccccc
? 匹配0次或1次 zxc? zxc、zx
{m} 匹配m次 zxc{3}vb zxcccvb
{m,} 匹配m次或多次 zxc{3,}vb zxcccvb、zxccccccccvb
{,n} 匹配0次到n次 zxc{,3}vb zxvb、zxcvb、zxccvb、zxcccvb
{m,n} 匹配m次到n次 zxc{1,3} zxcvb、zxccvb、zxcccvb

4.斷言 斷言,又稱零寬斷言,指的是當(dāng)斷言表達式為 True 時才進行匹配,但是并不匹配斷言表達式內(nèi)容。和 ^ 代表開頭, $ 代表結(jié)尾, \b 代表單詞邊界一樣,先行斷言和后行斷言也有類似的作用,它們只匹配某些位置,在匹配過程中,不占用字符,所以被稱為零寬。所謂位置,是指字符串中第一個字符的左邊、最后一個字符的右邊以及相鄰字符的中間。零寬斷言表達式有四種:

  • 零寬度負回顧后發(fā)斷言 (?<!exp),表達式不成立時匹配斷言后面的位置,成立時不匹配。例如 \w+(?<zxc)\d,匹配不以 zxc 結(jié)尾的字符串;
  • 零寬度負回顧先行斷言 (?!exp),表達式匹配斷言前面的位置,成立時則不匹配。例如:\d(?!zxc)\w+,匹配不以 zxc 開頭的字符串;
  • 先行斷言 (?=exp),斷言為真時匹配斷言前面的位置,例如要在 “a regular expression” 這個字符串中追匹配出 regular 中的 re ,我們可以這么寫 re(?=gular);
  • 后發(fā)斷言 (?<=exp),斷言為真時匹配斷言后面的位置,例如對 “egex represents regular expression” 這個字符串要想匹配除 regex 和 regular 之外的re,可以用 re(?!g),該表達式限定了re右邊的位置,這個位置后面不是字符g。先行和后發(fā)的區(qū)別就在于該位置之后的字符能否匹配括號中的表達式。

5.貪婪/非貪婪 正則表達式會盡可能多的去匹配字符,這被稱為貪婪模式,貪婪模式是正則表達式默認的模式。但是有時候貪婪模式會給我們造成不必要的困擾,例如我們要匹配字符串 “Jack123Chen123Chen” 中的 “Jack123Chen”,但是貪婪模式匹配出的卻是 “Jack123Chen123Chen”,這時我們就需要用到非貪婪模式來解決這個問題,非貪婪模式常用的表達式如下: 

語法 說明
*? 匹配0次或多次,但要盡可能少重復(fù)
+? 匹配1次或多次,但要盡可能少重復(fù)
?? 匹配0次或1次,但要盡可能少重復(fù)
{m,}? 匹配m次或多次,但要盡可能少重復(fù)
{m,n}? 匹配m次或n次,但要盡可能少重復(fù)

6.其他 上述內(nèi)容在正則表達式中都是常用的,下面我們再來看看不常用到的,但是功能同樣強大的語法。

  • OR 匹配又稱匹配分支,也就是說只要有一個分支匹配就算匹配,這和我們在開發(fā)中使用的 OR 語句類似。OR 匹配利用 | 分割分支,例如我們需要匹配出英文姓名,但是在英文中姓和名中間有可能是以 · 分割,也有可能是以空格分隔,這時我們就可以利用 OR 匹配來處理這個問題。格式如下:[A-Za-z]+·[A-Za-z]+|[A-Za-z]+\s[A-Za-z]+
  • 組合,將幾個項組合為一個單元,這個單元可通過* + ? | 等符號加以修飾,而且可以記住和這個組合相匹配的字符串以提供伺候的引用使用。分組使用 () 來表示。例如獲取日期的正則表達式可以這么寫:\d{4}-(0[1-9]|1[0-2])-(0[1-9]|12|3[01])。第一個分組 (0[1-9]|1[0-2]) 代表月的正則匹配,第二個分組 (0[1-9]|12|3[01]) 代表日的正則匹配。

一、Python 使用正則表達式

在 Python 中使用正則表達式很簡單,re 模塊向我們提供了正則表達式的支持。使用步驟一共三步:

  • 將正則表達式字符串轉(zhuǎn)換為 Pattern 的實例;
  • 使用 Pattern 實例去處理要匹配的字符,匹配結(jié)果是一個 Match 實例;
  • 利用 Match 實例去進行之后的操作。

在 Python 中我們常用的 re 的方法有六種,分別是: compile 、 match 、 search 、 findall 、 split 和 sub ,下面就針對這六種方法進行一下講解。

compile compile 方法的作用是將正則表達式字符串轉(zhuǎn)化為 Pattern 實例,它具有兩個參數(shù) pattern 和 flags ,pattern 參數(shù)類型是 string 類型,接收的是正則表達式字符串,flags 類型是 int 類型,接收的是匹配模式的編號,flags 參數(shù)是非必填項,默認值為 0 (忽略大小寫)。flags 匹配模式有如下 6 種: 

匹配模式 說明
re.I 忽略大小寫
re.M 多行匹配模式
re.S 任意匹配模式
re.L 預(yù)定義字符匹配模式
re.U 限定字符匹配模式
re.V 詳細模式

上述六種模式在實際開發(fā)中很少用到,我們只需要了解即可。 使用 compile 很簡單,如下: 

import re ​ 
pattern = re.compile(r'\d') 

2.match match 的作用是利用 Pattern 實例,從字符串左側(cè)開始匹配,如果匹配到就返回一個 Match 實例,如果沒有匹配到就返回 None。

import re ​ 
def getMatch(message): 
  pattern = re.compile(r'(\d{4}[-年])(\d{2}[-月])(\d{2}日{(diào)0,1})') 
  match = re.match(pattern, message) 
  if match: 
    print(match.groups()) 
    for item in match.groups(): 
      print(item) 
  else: 
    print("沒匹配上") ​ 
​ 
if __name__ == '__main__': 
  message = "2019年01月23日大會開始" 
  getMatch(message) 
  message = "會議于2019-01-23召開" 
  getMatch(message) 

在代碼中我們使用了 groups 方法,這個方法用來獲取匹配出來的字符串組。到這里過一會有很多讀者感到納悶,為什么第一段內(nèi)容能匹配出來年月日,而第二段內(nèi)容不能呢?這是因為 match 方法是從字符串的起始位置匹配的。 代碼運行結(jié)果如圖:

3.search search 方法與 match 方法功能是一樣的,只不過 search 方法是對整個字符串進行匹配。將前一小節(jié)代碼中的 getMatch 方法進行改動,即可將第二段內(nèi)容中的年月日匹配出來。

import re ​ 
def getMatch(message): 
  pattern = re.compile(r'(\d{4}[-年])(\d{2}[-月])(\d{2}日{(diào)0,1})') 
  match = re.search(pattern, message) 
  if match: 
    print(match.groups()) 
    for item in match.groups(): 
      print(item) 
  else: 
    print("沒匹配上") ​ 
​ 
if __name__ == '__main__': 
  message = "2019年01月23日大會開始" 
  getMatch(message) 
  message = "會議于2019-01-23召開" 
  getMatch(message) 

上述代碼運行結(jié)果如下圖:

4.findall findall 方法的作用是匹配整個字符串,以列表的形式返回所有匹配結(jié)果。

import re ​ 
​ 
def getMatch(message): 
  pattern = re.compile(r'\w+') 
  match = re.findall(pattern, message) 
  if match: 
    print(match) 
  else: 
    print("沒匹配上") ​ 
​ 
if __name__ == '__main__': 
  message = "my name is 張三" 
  getMatch(message) 
  message = "張三 is me" 
  getMatch(message) 

代碼運行結(jié)果如下圖:

5.split split 方法是利用指定的字符來分割字符串。

import re ​ 
​ 
def getMatch(message): 
  pattern = re.compile(r'-') 
  match = re.split(pattern, message) 
  if match: 
    print(match) 
  else: 
    print("沒匹配上") ​ 
​ 
if __name__ == '__main__': 
  message = "2018-9-12" 
  getMatch(message) 
  message = "第一步-第二步-第三步-第四步-and more" 
  getMatch(message) 

上述代碼運行結(jié)果如下圖:

6.sub sub 方法用來替換字符串,它接受5個參數(shù),其中常用的有三個:

  • pattern,Pattern 實例
  • string,等待替換的字符串
  • repl,表示替換的新字符串或需要執(zhí)行的替換方法
  • count,替換次數(shù),默認為0表示全部替換
import re ​ 
​ 
def getMatch(match): 
  return match.group(0).replace(r'年齡', 'age') ​ 
​ 
if __name__ == '__main__': 
  message = "your 年齡 ?" 
  pattern=re.compile(r'\w+') 
  print(re.sub(pattern,getMatch,message)) 

代碼運行結(jié)果如下圖:

三、總結(jié)

Python 中正則表達式使用起來非常方便,上面所展示的代碼,完全可以直接復(fù)制出來稍加修改后放在項目中使用。內(nèi)容不多,主要是講解代碼怎么使用,希望大家完全理解掌握了正則表達式的寫法。

作者簡介:
朱鋼,筆名喵叔,國內(nèi)某技術(shù)博客認證專家,.NET高級開發(fā)工程師,7年一線開發(fā)經(jīng)驗,參與過電子政務(wù)系統(tǒng)和AI客服系統(tǒng)的開發(fā),以及互聯(lián)網(wǎng)招聘網(wǎng)站的架構(gòu)設(shè)計,目前就職于一家初創(chuàng)公司,從事企業(yè)級安全監(jiān)控系統(tǒng)的開發(fā)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python腳本在Appium庫上對移動應(yīng)用實現(xiàn)自動化測試

    Python腳本在Appium庫上對移動應(yīng)用實現(xiàn)自動化測試

    這篇文章主要介紹了使用Python的Appium庫對移動應(yīng)用實現(xiàn)自動化測試的教程,屬于Python腳本的一個自動化應(yīng)用,需要的朋友可以參考下
    2015-04-04
  • python實現(xiàn)2048小游戲

    python實現(xiàn)2048小游戲

    本文給大家分享的是個人修改自某網(wǎng)友的Python實現(xiàn)2048小游戲的代碼,推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • keras分類之二分類實例(Cat and dog)

    keras分類之二分類實例(Cat and dog)

    這篇文章主要介紹了keras分類之二分類實例(Cat and dog),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 詳解python中eval函數(shù)的作用

    詳解python中eval函數(shù)的作用

    在本篇文章里小編給大家整理的是關(guān)于python中eval函數(shù)作用以及實例代碼,需要的朋友們參考下吧。
    2019-10-10
  • Python 使用PIL.Image制作運動小人的動態(tài)圖思路詳解

    Python 使用PIL.Image制作運動小人的動態(tài)圖思路詳解

    這篇文章主要介紹了Python 使用PIL.Image制作一個運動小人的動態(tài)圖,制作過程也很簡單,只需要把圖片拆分成12等分,每幀大小:67x165;連續(xù)讀取和播放就會形成動態(tài)圖像,需要的朋友可以參考下
    2021-10-10
  • Python中的sorted函數(shù)應(yīng)用及文件操作詳解

    Python中的sorted函數(shù)應(yīng)用及文件操作詳解

    這篇文章主要介紹了Python中的sorted函數(shù)應(yīng)用及文件操作詳解,python只能將字符串寫入到文本文件,要將數(shù)值數(shù)據(jù)存儲到文本本件中,必須先試用函數(shù)str()將其轉(zhuǎn)換為字符串格式,需要的朋友可以參考下
    2023-12-12
  • Python語言內(nèi)置數(shù)據(jù)類型

    Python語言內(nèi)置數(shù)據(jù)類型

    這篇文章主要介紹了Python語言中數(shù)據(jù)類型支持得運算符,Python語言提供了豐富的內(nèi)置數(shù)據(jù)類型。用于有效的處理各種類型的數(shù)據(jù),下文將介紹到其數(shù)據(jù)類型支持的運算符等相關(guān)內(nèi)容,需要的朋友可以參考一下
    2022-02-02
  • 詳解selenium + chromedriver 被反爬的解決方法

    詳解selenium + chromedriver 被反爬的解決方法

    這篇文章主要介紹了詳解selenium + chromedriver 被反爬的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • python基礎(chǔ)之Socket套接字詳解

    python基礎(chǔ)之Socket套接字詳解

    這篇文章主要介紹了python基礎(chǔ)之Socket套接字詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python基礎(chǔ)的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • python定義類的簡單用法

    python定義類的簡單用法

    在本篇文章里小編給大家分享的是一篇關(guān)于python定義類的簡單用法,需要的朋友們可以參考下。
    2020-07-07

最新評論