Python學習 ——正則表達式

来源:http://www.cnblogs.com/huan-ge/archive/2017/04/28/6771699.html
-Advertisement-
Play Games

正則表達式是一個特殊的字元序列,它能幫助你方便的檢查一個字元串是否與某種模式匹配。 re 模塊使 Python 語言擁有全部的正則表達式功能。 compile 函數根據一個模式字元串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換。 re 模塊也提供了與這些方法功 ...


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

re 模塊使 Python 語言擁有全部的正則表達式功能。

compile 函數根據一個模式字元串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換。

re 模塊也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字元串做為它們的第一個參數

1.正則表達式修飾符 --可選標誌

   正則表達式可以包含一些可選標誌修飾符來控制匹配的模式

 修飾符被指定為一個可選的標誌。多個標誌可以通過按位OR(|)來指定。如re.I | re.M 被設置成I 和M 的標誌

  

修飾符描述
re.I 使匹配對大小寫不敏感
re.L 做本地化識別(locale-aware)匹配
re.M 多行匹配,影響 ^ 和 $
re.S 使 . 匹配包括換行在內的所有字元
re.U 根據Unicode字元集解析字元。這個標誌影響 \w, \W, \b, \B.
re.X 該標誌通過給予你更靈活的格式以便你將正則表達式寫得更易於理解。

 

2.正則表達式模式

    下圖列出了Python支持的正則表達式元字元和語法(圖片來自http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html)

   pyre

3.re模塊

   1)re.match函數

  re.match 嘗試從字元串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。

  函數語法: re.match(pattern, string, flags=0)

  pattern:匹配的正則表達式

  string:匹配的字元串

  flags:標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

  匹配成功re.match方法返回一個匹配的對象,否則返回None。


start()                 返回匹配開始的位置                                                                                    
end() 返回匹配結束的位置
span() 返回一個元組包含匹配 (開始,結束) 的位置
group() 返回被 RE 匹配的字元串
group(num=0) 匹配的整個表達式的字元串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
groups() 返回一個包含所有小組字元串的元組,從 1 到 所含的小組號。

 






實例一:
 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 '''
 4 # @time    : 2017/4/26 20:03
 5 # @author  : huange
 6 # @version : 1.1
 7 # @file    : test2.py
 8 # @Software: PyCharm
 9 '''
10 import re
11 print(re.match('www','www.hh.com').span())     # 在起始位置匹配
12 print(re.match('com','www.hh.com'))            # 不在起始位置匹配
13 
14 
15 結果:
16 (0,317  None
實例二:
 1 #!/usr/bin/python3
 2 import re
 3 
 4 line = "Cats are smarter than dogs"
 5 
 6 obj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
 7 
 8 if obj:
 9    print ("obj.group() : ", obj.group())
10    print ("obj.group(1) : ", obj.group(1))
11    print ("obj.group(2) : ", obj.group(2))
12    print(obj.start())
13    print(obj.end())
14    print(obj.groups())
15 else:
16    print ("No match!!")
17 
18 
19 結果:
20 obj.group() :  Cats are smarter than dogs
21 obj.group(1) :  Cats
22 obj.group(2) :  smarter
23 0
24 26
25 ('Cats', 'smarter')
2)re.search函數
re.search掃描整個字元串並返回第一個成功的匹配
函數語法: re.match(pattern,string, flags=0)
pattern:匹配的正則表達式
string:匹配的字元串
flags:標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

匹配成功re.search方法返回一個匹配的對象,否則返回None。

實例一:
1 import re
2 print(re.search('www','www.hh.com').span())
3 print(re.search('com','www.hh.com').span())
4 
5 結果:
6      (0,3)
7      (7,10)
實例二:
 1 #!/usr/bin/python3
 2 import re
 3 
 4 line = "Cats are smarter than dogs"
 5 
 6 obj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
 7   
 8 if obj:
 9     print ("obj.group() : ", obj.group())
10     print ("obj.group(1) : ", obj.group(1))
11     print ("obj.group(2) : ", obj.group(2))
12     print(obj.start())
13     print(obj.end())
14     print(obj.groups())
15 else:
16     print ("No match!!")
17 
18  
19  結果:
20  obj.group() :  Cats are smarter than dogs
21  obj.group(1) :  Cats
22  obj.group(2) :  smarter
23  0
24  26
25 ('Cats', 'smarter')
PS:re.match只匹配字元串的開始,如果字元串開始不符合正則表達式,則匹配失敗,函數返回None; re.search匹配整個字元串,直到找到一個匹配。

3)re.sub函數
  re.sub用於替換字元串中匹配到的選項
  
函數語法re.sub(pattern, repl, string, count=0)
 
pattern : 正則中的模式字元串。
  repl : 替換的字元串,也可為一個函數。
  string : 要被查找替換的原始字元串。
  count : 模式匹配後替換的最大次數,預設 0 表示替換所有的匹配。

實例一:
 1 #!/usr/bin/python3
 2 import re
 3 phone = '135-4238-5642  # 電話號碼'
 4 
 5 # 刪除註釋
 6 num = re.sub('#.*$','',phone)
 7 print(num)
 8 
 9 # 刪除非字元
10 num = re.sub('\D','',phone)
11 print(num)
12 
13 結果:
14     135-4238-5642  
15     13542385642

  實例二:

 1 #!/usr/bin/python
 2 
 3 import re
 4 
 5 # 將匹配的數字乘於 2
 6 def double(matched):
 7     value = int(matched.group('value'))
 8     return str(value * 2)
 9 
10 s = 'A23G4HFD567'
11 print(re.sub('(?P<value>\d+)', double, s))
12 
13 結果為: 
14      A46G8HFD1134

4)re.split函數

   函數語法:re.split(pattern,string,maxsplit)
 按照能夠匹配的子串將string分割後返回列表。maxsplit用於指定最大分割次數,不指定將全部分割。

 

1 import re
2 
3 p = re.split(r'\d+','one1two2three3four4')
4 print(p)

結果:
['one','two','three','four','']

5)re.findall函數
   以列表的形式返回能全部匹配到的子串

 函數語法:re.findall(pattern, string ,flags):

  

1 import re
2 
3 p = re.findall(r'\d+','one1two2three3four4')
4 print(p)
5 
6 結果:
7         ['1','2','3','4']


 


 


 


 

 

 











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

-Advertisement-
Play Games
更多相關文章
  • 本系列英文原文出自。 提示1. 在Entity Framework中怎樣排序關係(Relationships) 問題: 在Entity Framework論壇中常會看到關於排序相關聯項目的問題。 例如,想象你要查詢客戶,並返回那些欠款超過30的賬戶,與此同時檢索這些賬戶的訂單。 並且你需要將那些訂單 ...
  • 平時我們在用多線程開發的時候少不了Task,確實task給我們帶來了巨大的編程效率,在Task底層有一個TaskScheduler,它決定了task該如何被調度,而 在.net framework中有兩種系統定義Scheduler,第一個是Task預設的ThreadPoolTaskScheduler ...
  • 首先,通過NuGet添加NPOI. NPOI依賴SharpZipLib,通過NuGet添加SharpZipLib. 然後添加NPOI. 添加後項目的引用列表如下: 把DataTable轉換成Excel文件。 代碼如下: public static MemoryStream RenderDataTab ...
  • AspNetCore - MVC實戰系列目錄 . 愛留圖網站誕生 . AspNetCore - MVC實戰系列(一)之Sqlserver表映射實體模型 . AspNetCore-MVC實戰系列(二)之通過綁定郵箱找回密碼 開篇嘮嗑 本篇內容寫在5.1假期前夕,主要是讓大家能在節假日休息充點的時候能有 ...
  • 《Effective C#》快速筆記(三)- 使用 C# 表達設計 目錄 二十一、限制類型的可見性 二十二、通過定義並實現介面替代繼承 二十三、理解介面方法和虛方法的區別 二十四、用委托實現回調 二十五、用事件模式實現通知 二十六、避免返回對內部類對象的引用 二十七、讓類型支持序列化 二十八、提供組 ...
  • //設置頁眉頁腳 tempSheet.Header.Center = "2017-04-27"; tempSheet.Footer.Center = "√" + " 正常 " + "×" + " 故障 " + "○" + " 其他 "; //設置單元格邊線ICellStyle style = wb1 ...
  • NetMQ是ZeroMQ的C#移植版本,它是對標準socket介面的擴展。它提供了一種非同步消息隊列,多消息模式,消息過濾(訂閱),對多種傳輸協議的無縫訪問。本文記錄了NetMQ的源碼進行學習並分析理解。 ...
  • 1.1Spring框架的概述 1.1.1什麼是Spring Spring是分層的JavaSE和JavaEES一站式輕量級開源框架。 分層: SUN提供的EE的三層結構:web層、業務層、數據訪問層(持久層、集成層)。 Struts2是web層基於MVC設計模式框架。 Hibernate是持久層的一個 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...