Python之re模塊 —— 正則表達式操作

来源:http://www.cnblogs.com/shouce/archive/2016/05/25/5525711.html
-Advertisement-
Play Games

這個模塊提供了與 Perl 相似l的正則表達式匹配操作。Unicode字元串也同樣適用。 正則表達式使用反斜杠" \ "來代表特殊形式或用作轉義字元,這裡跟Python的語法衝突,因此,Python用" \\\\ "表示正則表達式中的" \ ",因為正則表達式中如果要匹配" \ ",需要用\來轉義, ...


這個模塊提供了與 Perl 相似l的正則表達式匹配操作。Unicode字元串也同樣適用。

 

正則表達式使用反斜杠" \ "來代表特殊形式或用作轉義字元,這裡跟Python的語法衝突,因此,Python用" \\\\ "表示正則表達式中的" \ ",因為正則表達式中如果要匹配" \ ",需要用\來轉義,變成" \\ ",而Python語法中又需要對字元串中每一個\進行轉義,所以就變成了" \\\\ "。

 

上面的寫法是不是覺得很麻煩,為了使正則表達式具有更好的可讀性,Python特別設計了原始字元串(raw string),需要提醒你的是,在寫文件路徑的時候就不要使用raw string了,這裡存在陷阱。raw string就是用'r'作為字元串的首碼,如 r"\n":表示兩個字元"\"和"n",而不是換行符了。Python中寫正則表達式時推薦使用這種形式。

 

絕大多數正則表達式操作與 模塊級函數或RegexObject方法 一樣都能達到同樣的目的。而且不需要你一開始就編譯正則表達式對象,但是不能使用一些實用的微調參數。

 

1.正則表達式語法

        為了節省篇幅,這裡不再敘述了。

 

2.martch和search的區別

        Python提供了兩種不同的原始操作:match和search。match是從字元串的起點開始做匹配,而search(perl預設)是從字元串做任意匹配。

 

        註意:當正則表達式是' ^ '開頭時,match與search是相同的。match只有當且僅當被匹配的字元串開頭就能匹配 或 從pos參數的位置開始就能匹配 時才會成功。如下:

>>> import re 
>>> re.match("c", "abcdef") 
>>> re.search("c","abcdef") 
<_sre.SRE_Match object at 0x00A9A988>

>>> re.match("c", "cabcdef") 
<_sre.SRE_Match object at 0x00A9AB80>

>>> re.search("c","cabcdef") 
<_sre.SRE_Match object at 0x00AF1720>

>>> patterm = re.compile("c") 
>>> patterm.match("abcdef") 
>>> patterm.match("abcdef",1) 
>>> patterm.match("abcdef",2) 
<_sre.SRE_Match object at 0x00A9AB80>

3.模塊內容

re.compile(pattern, flags=0)

 

編譯正則表達式,返回RegexObject對象,然後可以通過RegexObject對象調用match()和search()方法。

 

prog = re.compile(pattern)

result = prog.match(string)

result = re.match(pattern, string)

是等價的。

 

第一種方式能實現正則表達式的重用。

 

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

 

在字元串中查找,是否能匹配正則表達式。返回_sre.SRE_Match對象,如果不能匹配返回None。

 

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

 

字元串的開頭是否能匹配正則表達式。返回_sre.SRE_Match對象,如果不能匹配返回None。

 

re.split(pattern, string, maxsplit=0)

 

通過正則表達式將字元串分離。如果用括弧將正則表達式括起來,那麼匹配的字元串也會被列入到list中返回。maxsplit是分離的次數,maxsplit=1分離一次,預設為0,不限制次數。

>>> re.split('\W+', 'Words, words, words.') 
['Words', 'words', 'words', ''] 
>>> re.split('(\W+)', 'Words, words, words.') 
['Words', ', ', 'words', ', ', 'words', '.', ''] 
>>> re.split('\W+', 'Words, words, words.', 1) 
['Words', 'words, words.'] 
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)

 

註意:我使用的Python是2.6,查看源代碼發現split()並沒有flags的參數,2.7才增加。這種問題我發現不止一次了,官方的文檔 跟 源碼不一致的現象,如果發現異常,應該去源碼中找找原因。

 

如果在字元串的開始或結尾就匹配,返回的list將會以空串開始或結尾。

>>> re.split('(\W+)', '...words, words...') 
['', '...', 'words', ', ', 'words', '...', '']

 

如果字元串不能匹配,將會返回整個字元串的list。

>>> re.split("a","bbb") 
['bbb']

 

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

 

找到 RE 匹配的所有子串,並把它們作為一個列表返回。這個匹配是從左到右有序地返回。如果無匹配,返回空列表。

>>> re.findall("a","bcdef") 
[]

>>> re.findall(r"\d+","12a32bc43jf3") 
['12', '32', '43', '3']

 

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

 

找到 RE 匹配的所有子串,並把它們作為一個迭代器返回。這個匹配是從左到右有序地返回。如果無匹配,返回空列表。

>>> it = re.finditer(r"\d+","12a32bc43jf3") 
>>> for match in it: 
              print match.group()

12 
32 
43 
3

 

re.sub(pattern, repl, string, count=0, flags=0)

 

找到 RE 匹配的所有子串,並將其用一個不同的字元串替換。可選參數 count 是模式匹配後替換的最大次數;count 必須是非負整數。預設值是 0 表示替換所有的匹配。如果無匹配,字元串將會無改變地返回。

 

re.subn(pattern, repl, string, count=0, flags=0)

 

與re.sub方法作用一樣,但返回的是包含新字元串和替換執行次數的兩元組。

 

re.escape(string)

 

對字元串中的非字母數字進行轉義

 

re.purge()

 

清空緩存中的正則表達式

 

4.正則表達式對象

 

re.RegexObject

 

re.compile()返回RegexObject對象

 

re.MatchObject

 

group()返回被 RE 匹配的字元串

start()返回匹配開始的位置

end()返回匹配結束的位置

span()返回一個元組包含匹配 (開始,結束) 的位置

 

5.編譯標誌

編譯標誌讓你可以修改正則表達式的一些運行方式。在 re 模塊中標誌可以使用兩個名字,一個是全名如 IGNORECASE,一個是縮寫,一字母形式如 I。(如果你熟悉 Perl 的模式修改,一字母形式使用同樣的字母;例如 re.VERBOSE的縮寫形式是 re.X。)多個標誌可以通過按位 OR-ing 它們來指定。如 re.I | re.M 被設置成 I 和 M 標誌:

I 
IGNORECASE

使匹配對大小寫不敏感;字元類和字元串匹配字母時忽略大小寫。舉個例子,[A-Z]也可以匹配小寫字母,Spam 可以匹配 "Spam", "spam", 或 "spAM"。這個小寫字母並不考慮當前位置。

L 
LOCALE

影響 "w, "W, "b, 和 "B,這取決於當前的本地化設置。

locales 是 C 語言庫中的一項功能,是用來為需要考慮不同語言的編程提供幫助的。舉個例子,如果你正在處理法文文本,你想用 "w+ 來匹配文字,但 "w 只匹配字元類 [A-Za-z];它並不能匹配 "é" 或 "?"。如果你的系統配置適當且本地化設置為法語,那麼內部的 C 函數將告訴程式 "é" 也應該被認為是一個字母。當在編譯正則表達式時使用 LOCALE 標誌會得到用這些 C 函數來處理 "w 後的編譯對象;這會更慢,但也會象你希望的那樣可以用 "w+ 來匹配法文文本。

M 
MULTILINE

(此時 ^ 和 $ 不會被解釋; 它們將在 4.1 節被介紹.)

使用 "^" 只匹配字元串的開始,而 $ 則只匹配字元串的結尾和直接在換行前(如果有的話)的字元串結尾。當本標誌指定後, "^" 匹配字元串的開始和字元串中每行的開始。同樣的, $ 元字元匹配字元串結尾和字元串中每行的結尾(直接在每個換行之前)。

S 
DOTALL

使 "." 特殊字元完全匹配任何字元,包括換行;沒有這個標誌, "." 匹配除了換行外的任何字元。

X 
VERBOSE

該標誌通過給予你更靈活的格式以便你將正則表達式寫得更易於理解。當該標誌被指定時,在 RE 字元串中的空白符被忽略,除非該空白符在字元類中或在反斜杠之後;這可以讓你更清晰地組織和縮進 RE。它也可以允許你將註釋寫入 RE,這些註釋會被引擎忽略;註釋用 "#"號 來標識,不過該符號不能在字元串或反斜杠之後。

 

最後:如果能用字元串的方法,就不要選擇正則表達式,因為字元串方法更簡單快速。


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

-Advertisement-
Play Games
更多相關文章
  • 直接在vs2013里的App_Data目錄創建資料庫,在伺服器資源管理器中查看時報錯: 未能載入包“Microsoft SQL Server Data Tools” 英文: 以下是右擊表的效果。 解決方案: 1.去https://msdn.microsoft.com/zh-cn/dn864412 下 ...
  • 今天在ASP.NET MVC項目中,實現一個小功能,就是記錄瀏覽者客戶端的一些信息。比如瀏覽者的IP,訪問了哪些頁面,以及瀏覽器相關的信息。在資料庫中創建一張表[VisitData]: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI ...
  • ...
  • 本文是Linux Shell系列教程的第(四)篇,更多shell教程請看:Linux Shell系列教程 與許多的編程語言一樣,Shell中也有註釋符號,今天就為大家來介紹下Shell中的註釋的語法及用法。 Shell中的註釋以“#”號開頭,所有以“#”號開頭的代碼都會被解釋器所忽略。 比如下麵的代 ...
  • 官方文檔給出了兩種Yii2的安裝方式。一種是通過歸檔文件安裝,另一種則是通過composer進行安裝。兩種方式具體有什麼不同呢?我們這裡不討論,安裝完了你自然也就明白了。 相信很多小伙伴想學Yii2,但是大部分都死在了開頭。所謂萬事開頭難,Yii2無疑更好的證實了這一點,還沒開始就先給你一棒槌。 安 ...
  • 利用介面做參數,寫個計算器,能完成+-*/運算 (1)定義一個介面Compute含有一個方法int computer(int n,int m); (2)設計四個類分別實現此介面,完成+-*/運算 (3)設計一個類UseCompute,含有方法:public void useCom(Compute c ...
  • 概述 GenEvent 是事件處理的通用部分的抽象。 通過 GenEvent ,我們給已有的服務 動態 的添加 事件處理。 GenEevent 和 GenServer 的區別 之前已經介紹了 GenServer ,GenServer 和 GenEvent 的主要區別在於: GenServer 是服務 ...
  • WIN 下的超動態菜單(一)簡介 WIN 下的超動態菜單(二)用法 作者:黃山松,發表於博客園:http://www.cnblogs.com/tomview/ auto_dynamenu 是一個動態生成WINDOWS菜單的c++封裝庫,設計思路是要儘量簡化動態菜單的生成代碼,在程式界面任何地方想要顯... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...