python基礎——正則表達式

来源:http://www.cnblogs.com/jiaojianglong/archive/2017/05/08/6825180.html
-Advertisement-
Play Games

正則表達式 正則表達式為高級的文本模式匹配、抽取、與/或文本形式的搜索和替換功能提供了基礎。簡單的說,正則表達式是一些由字元和特殊符號組成的字元串,他們描述了模式的重覆或者表述多個字元,於是正則表達式能按照某種模式匹配一系列有相似特征的字元串。換句話說,他們能夠匹配多個字元串,一種只能匹配一個字元串 ...


正則表達式

 

正則表達式為高級的文本模式匹配、抽取、與/或文本形式的搜索和替換功能提供了基礎。簡單的說,正則表達式是一些由字元和特殊符號組成的字元串,他們描述了模式的重覆或者表述多個字元,於是正則表達式能按照某種模式匹配一系列有相似特征的字元串。換句話說,他們能夠匹配多個字元串,一種只能匹配一個字元串的正則表達式模式是很乏味並且毫無作用的。

主要分為兩部分:

  1.正則表達式

  2.python中的re模塊

 

所有關於正則表達式的操作都使用 python 標準庫中的 re 模塊。

 

 

我們的第一個正則表達式

1 import re
2 
3 pattern = re.compile(r'Python')#進行預編譯
4 m = re.search(pattern,'Hello Python')
5 
6 print(m.group())

>>>Python

1 import re
2 
3 m = re.search(r'Python','Hello Python')
4 
5 print(m.group())
#沒有預編譯,結果也是相同的
>>>Python

 

1.pattern = re.compile(r'Python')

 將正則表達式進行預編譯,也可以不編譯直接進行匹配,但是在代碼執行過程中,解釋器都會將正則表達式模式編譯成正則表達式對象,而且正則表達式在執行過程中將進行多次比較操作,因此強烈建議使用預編譯。

 

2.r'Python'

 一個形式最簡單的正則表達式,匹配字元串中的Python。

 python中字元串前面加 r   表示原生字元串

與大多數編程語言相同,正則表達式里使用"\"作為轉義字元,這就可能造成反斜杠困擾。假如你需要匹配文本中的字元"\",那麼使用編程語言表示的正則表達式里將需要4個反斜杠"\\\\":前兩個和後兩個分別用於在編程語言里轉義成反斜杠,轉換成兩個反斜杠後再在正則表達式里轉義成一個反斜杠。Python里的原生字元串很好地解決了這個問題,這個例子中的正則表達式可以使用r"\\"表示。同樣,匹配一個數字的"\\d"可以寫成r"\d"。有了原生字元串,你再也不用擔心是不是漏寫了反斜杠,寫出來的表達式也更直觀。
原生字元串

 正則表達式的表達方式還有很多,一會兒會做說明,更詳細的還請查閱相關文檔。

 

3.re.search(r'Python','Hello Python')

 調用 python 中 re 模塊的 search() 方法,第一個參數是正則表達式,第二個參數是要進行匹配的字元串,返回一個匹配對象

 re 模塊中還有很多方法,下麵也會做介紹。

 

4.m.group()

 m就是匹配對象,所以如果直接print(m),會輸出一個對象,並不能得到我們想看到的匹配結果。

 匹配對象有兩個主要的方法:group()和groups(),我們用這兩個方法來得到我們想要的結果。具體用法後面會詳細講解。

 

 

下麵進入到正式的正則表達式學習中

接下來會將我們上面第一個正則表達式中的知識點進行詳細講解,如果在接下來的學習中感到困惑,試著將相關內容替換到上面的代碼中理解。

 

一、正則表達式

  

1.普通字元描述

 匹配除 “\n” 之外的任何單個字元。要匹配包括 ‘\n’ 在內的任何字元,請使用象 ‘[.\n]‘ 的模式。
x|y 匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 則匹配 “zood” 或 “food”。
[xyz]   字元集合。匹配所包含的任意一個字元。例如, ‘[abc]‘ 可以匹配 “plain” 中的 ‘a’。
[^xyz] 負值字元集合。匹配未包含的任意字元。例如, ‘[^abc]‘ 可以匹配 “plain” 中的’p','l','i','n'。
[a-z]  字元範圍。匹配指定範圍內的任意字元。例如,’[a-z]‘ 可以匹配 ‘a’ 到 ‘z’ 範圍內的任意小寫字母字元。
[^a-z] 負值字元範圍。匹配任何不在指定範圍內的任意字元。例如,’[^a-z]‘ 可以匹配任何不在 ‘a’ 到 ‘z’ 範圍內的任意字元。
\d   匹配一個數字字元。等價於 [0-9]。
\D  匹配一個非數字字元。等價於 [^0-9]。
\w  匹配包括下劃線的任何單詞字元。等價於’[A-Za-z0-9_]‘。
\W

 匹配任何非單詞字元。等價於 ‘[^A-Za-z0-9_]‘。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.特殊字元描述

$  匹配輸入字元串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字元本身,請使用 \$。
( ) 標記一個子表達式的開始和結束位置。子表達式可以獲取供以後使用。要匹配這些字元,請使用 \( 和 \)。
* 匹配前面的子表達式零次或多次。要匹配 * 字元,請使用 \*。
+ 匹配前面的子表達式一次或多次。要匹配 + 字元,請使用 +。
. 匹配除換行符 \n之外的任何單字元。要匹配 .,請使用 \。
 標記一個中括弧表達式的開始。要匹配 [,請使用 \[。
? 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字元,請使用 \?。
將下一個字元標記為或特殊字元、或原義字元、或後向引用、或八進位轉義符。例如, 'n' 匹配字元 'n'。'\n' 匹配換行符。序列 '\' 匹配 "\",而 '\(' 則匹配 "("。
^ 匹配輸入字元串的開始位置,除非在方括弧表達式中使用,此時它表示不接受該字元集合。要匹配 ^ 字元本身,請使用\^。
{ 標記限定符表達式的開始。要匹配 {,請使用 \{。
指明兩項之間的一個選擇。要匹配 |,請使用 \|。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

3.非列印字元

 \f  匹配一個換頁符。等價於 \x0c 和 \cL。
 \n  匹配一個換行符。等價於 x0a 和 cJ。
 \r  匹配一個回車符。等價於 x0d 和 cM。
 \s  匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [?\f\n\r\t\v]。
 \S  匹配任何非空白字元。等價於 [^?\f\n\r\t\v]。
 \t   匹配一個製表符。等價於 \x09 和 \cI。
 \v  匹配一個垂直製表符。等價於 \x0b 和 \cK。

 

 

 

 

 

 

 

 

 

 

 

  

4.限定符

匹配前面的子表達式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。 * 等價於{0,}。
+ 匹配前面的子表達式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價於 {1,}。
? 匹配前面的子表達式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等價於 {0,1}。
{n} n 是一個非負整數。匹配確定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個 o。
{n,} n 是一個非負整數。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等價於 ‘o+’。’o{0,}’ 則等價於 ‘o*’。
{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。劉, “o{1,3}” 將匹配 “fooooood” 中的前三個 o。’o{0,1}’ 等價於 ‘o?’。請註意在逗號和兩個數之間不能有空格。

 

 

 

 

 

 

 

 

 

 

看了這麼多,我們來上一些實例看看:

m = re.search(r'(p|t)h','the')
print(m.group())
#>>>th
m = re.search(r'[abcde]','the')#匹配字元集中任意字元
print(m.group())
#>>>e
m = re.search(r'..','the')#  . 匹配任意字元(不包括\n)
print(m.group())
#>>>th
m = re.search(r'^ind(e|a)','inda inde')#匹配字元串起始部分
print(m.group())
#>>>inda
m = re.search(r'ind(e|a)$','inda inde')#匹配字元串終止部分
print(m.group())
#>>>inde
m = re.search(r'inde*','indeeeee')#匹配0次或多次前面出現的正則表達式
print(m.group())
#>>>indeeeee
m = re.search(r'inde{3}','indeeeee')#匹配n次前面出現的正則表達式
print(m.group())
#>>>indeee
m = re.search(r'inde*?','indeeeee')# 非貪婪匹配
print(m.group())
#>>>ind
m = re.search(r'inde+?','indeeeee')# 非貪婪匹配
print(m.group())
#>>>inde
m = re.search(r'i(nd)e*','indeeeee')# ()用於分組,配合group()方法使用
print(m.group(0),m.group(1))
#>>>indeeeee nd
示例

 

 

 二、正則表達式和python語言

  

1.match()方法

  從字元串的起始部分對模式進行匹配,如果匹配成功,就返回一個匹配對象,如果匹配失敗,就返回None

2.search()方法

  在字元串中搜索出模式第一次出現的匹配情況,如果成功就返回匹配對象,失敗返回None

3.findall()和finditer()查找每一次出現的位置

  查找模式在字元串中出現的所有位置,與search()和match()不同的是findall()總是返回一個列表,匹配失敗返回一個空列表,匹配成功,列表將包含所有成功的匹配部分。

  finditer()與findall()的區別在於返回的是一個迭代器還是一個列表。更節省記憶體。

4.sub()和subn()搜索與替換

  兩者幾乎一樣,都是將某字元串中所有匹配正則表達式的部分進行某種形式的替換。

  不同的是返回的值,sub()返回替換後的字元串,subn()返回替換後的字元串和表示替換總數的數字,一起作為一個擁有兩個元素的元組返回

5.split()分割字元串

  re.split()與str.split()的工作方式相同,可以通過為參數max設定一個值來指定最大分割數

m = re.match(r'foo','food on the table')
if m is not None:
    print(m.group())
#>>>foo

m = re.search(r'foo','seafood')
if m is not None:
    print(m.group())
#>>>foo

m = re.findall(r'th\w+','This and that.')
print(m)
#>>>['that']
m = re.findall(r'th\w+','This and that.',re.I)#不區分大小寫
print(m)
#>>>['This','that']
m = re.finditer(r'th\w+','This and that.',re.I)
for i in m:
    print(i.group())
#>>>This
#>>>that

m = re.sub(r'[ae]','X','abcdef')
print(m)
#>>>XbcdXf
m = re.subn(r'[ae]','X','abcdef')
print(m)
#>>>('XbcdXf', 2)

m = re.split(':','str1:str2:str3')
print(m)
#>>>['str1', 'str2', 'str3']
示例

6.group()和groups()方法

  匹配成功後返回的匹配對象擁有兩個方法,group()和groups()。

  group()要麼返回整個匹配對象,要麼根據要求返回特定子組。groups()則返回一個包含唯一或者全部子組的元組。如果沒有子組的要求,group()任然返回整個匹配,groups()則返回一個空元組。

m = re.match(r'(\w\w\w)-(\d\d\d)','abc-123')
print(m.group())
#>>>abc-123
print(m.group(1))
#>>>abc
print(m.group(2))
#>>>123
print(m.groups())
#>>>('abc', '123')
示例

 7.常用正則表達式

  1. 手機:/^0?1[3|4|5|8][0-9]\d{8}$/
  2. 固話:/^0[\d]{2,3}-[\d]{7,8}$/
  3. 電子郵箱:/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
    /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/
  4. 用戶名:/^[a-z0-9_-]{3,16}$/
  5. 密碼:/^[a-z0-9_-]{6,18}$/
  6. URL:/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 package IO; 2 3 import java.io.FileWriter; 4 import java.io.IOException; 5 6 class FileWrite_WenJianXuXie { 7 /*拋是為了方便演示 續寫功能,平時別拋*/ 8 public static... ...
  • [原創]用WinRAR實現VC源代碼快速壓縮創建 by edata @ cnblogs.com/edata 2017-5-8 22:31:57 我們有的時候需要對vc項目壓縮打包,因為vc項目的無關文件太多,直接壓縮的文件非常大,我們有必要過濾一些無關的文件,只需要我們要的源碼,這裡我給大家分享一種 ...
  • IntelliJ IDEA-2017.1.1 tomcat-8.5.13 問題:在IntelliJ IDEA中使用tomcat部署web app時,提示:Error during artifact deployment. See server log for details IntelliJ IDE ...
  • 多進程網路編程中處理fork後可能的僵死進程和可能被中斷的系統調用問題。 ...
  • Python實現 PHP實現 ...
  • 前段時間瞭解到Spring JPA,感覺挺好用,但其依賴於Hibernate,本人看到Hibernate就頭大(不是說Hibernate不好哈,而是進階太難),於是做了一個迷你版的Mybatis JPA. 一.簡介 1.1粗糙點 1.)Entity不支持實體類的嵌套; 2.)目前不支持批量操作,不支 ...
  • 今天學習第一模塊的最後一課課程--函數: python的第一個函數: 函數可返回各種數據類型: 同時返回多種類型時,將是返回一元組: 函數參數的調用: 1,位置調用:編寫時需要一一對應,如果少了,或是多少都會出錯! 2,關鍵字調用: 3,位置調用與關鍵字調用可以同時使用,但是需要註意的問題: 參數組 ...
  • 最近項目中有個定時任務的需求,定時檢查mysql數據與etcd數據的一致性,具體實現細節就不說了,今天要說的就是實現過程中遇到了druid拋出的異常,以及解決的過程 異常 異常詳細信息 五月 05, 2017 4:16:00 下午 com.alibaba.druid.proxy.DruidDrive ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...