python 正則表達式

来源:https://www.cnblogs.com/ss-long/archive/2019/03/07/10492831.html
-Advertisement-
Play Games

正則表達式的作用:用來匹配字元串 一、字元串方法字元串提供的方法是完全匹配,不能進行模糊匹配 s = 'hello world' # 字元串提供的方法是完全匹配,不能進行模糊匹配 print(s.find('ll')) # 2 查找ll的位置,輸出的是第一個l的位置 ret = s.replace(... ...


正則表達式的作用:用來匹配字元串

一、字元串方法

字元串提供的方法是完全匹配,不能進行模糊匹配
s = 'hello world'

# 字元串提供的方法是完全匹配,不能進行模糊匹配
print(s.find('ll'))  # 2   查找ll的位置,輸出的是第一個l的位置   
ret = s.replace('ll', 'xx')   # 替換,用ll 替換為 xx
print(ret)   # hexxo world   
print(s.split('w'))   # ['hello ', 'orld']   分割:以w為界限,分割為前後兩部分,存在列表中

二、正則表達式

正則的方法:
1、findall() :所有結果返回到一個列表裡
2、search() :返回匹配到的第一個對象,對象可以調用group()返回結果
3、match() :只在字元串開始匹配,也返回一個對象,可調用group()
findall() 方法:

1、正則表達式可以進行模糊匹配:

ret = re.findall(r'w\w{2}l', 'hello world')    # 匹配字元串中w開頭l結尾中間有兩個字元的詞
# (加r,聲明是原生字元串,避免字元串轉義)
print(ret)      # ['worl']

2、元字元

  • “.”  通配符:可以代指除換行符之外的所有字元,一個通配符只能代指任意一個字元
ret = re.findall('w..l', 'hello world')    # 匹配字元串中w開頭l結尾中間有兩個字元的字元串
print(ret)      # ['worl']
  • “^” 上尖角號,只在字元串開始的位置匹配匹配
ret = re.findall('^h..o', 'hjklshllo')  # 只在字元串的開始位置進行匹配,匹配不上就結束,不匹配後面的內容
print(ret)    # []

ret = re.findall('^h..o', 'hjkoshllo')
print(ret)    # ['hjko']
  • “$”符, 只在字元串結尾匹配
ret = re.findall('h..o$', 'hjkoshllo')
print(ret)    # ['hllo']

ret = re.findall('h..o$', 'hjkoshlyto')
print(ret)    # []
  • “*”號,重覆匹配(*還可以代指0個) ,*代指的個數是0到無窮
ret = re.findall('h.*o', 'hjkoshlytg')      # *表示重覆前面多個.  既只要是以h開頭o結尾的都行
print(ret)      # ['hjko']

ret = re.findall('h*', 'hhhhjlhl')        # 匹配多個h
print(ret)      # ['hhhh', '', '', 'h', '', '']

ret = re.findall('ah*', 'sdahhh')       # 貪婪匹配,既按最多的匹配
print(ret)      # ['ahhh']

ret = re.findall('ah*?', 'sdahhh')     # 後加?變為惰性匹配,既按最少的匹配
print(ret)      # ['a']
  • “+”號,重覆匹配,同*,但是個數最少為1個,如果是0個匹配不了,範圍是1到無窮
ret = re.findall('ah+', 'asdahhhjlhl')   # 匹配以ah開頭的內容
print(ret)    # ['ahhh']

ret = re.findall('a+b', 'aaabsdbhbhabj')
print(ret)    # ['aaab', 'ab']
  • “?”號,匹配的範圍是[0, 1]個
ret = re.findall('a?b', 'aaabsdhbhabj')   # 匹配[0, 1]個a
print(ret)      # ['ab', 'b', 'ab']
  • “{}”大括弧,自定義匹配的次數
ret = re.findall('a{2}b', 'aaabhaabhab')   # 匹配2個a開頭,b結尾共3位的字元
print(ret)  # ['aab', 'aab']

ret = re.findall('a{1,3}b', 'aaaabfaabhhab')   # 匹配1-3個a,以b結尾的字元
# 註意:{1,3} 之間不能有空格,不能寫成{1, 3}
print(ret)  # ['aaab', 'aab', 'ab']

ret = re.findall('a{1, }b', 'aaaaaaaab')   # {1,} 什麼都不加預設匹配的是正無窮
print(ret)      # ['aaaaaaaab']

ret = re.findall('a{1,3}b', 'aaaab')   # 匹配1-3個a,貪婪匹配原則,既預設按多的匹配
print(ret)  # ['aaab']

3、字元集

    取消元字元的特殊功能   
  • []
ret = re.findall('a[dc]b', 'adb')      # 匹配既可以是adb也可以是acb,只能2選一,註意[]裡面不用逗號隔開
print(ret)  # ['adb']

ret = re.findall('[a-z]', 'adb')       # 表示一個範圍
print(ret)  # 'a', 'd', 'b']

[]字元集還有取消元字元的特殊功能,(\ ^ -)例外:

ret = re.findall('[w,.]', 'awdb')     # .此時不是元字元,無特殊意義,而是一個普通的字元
print(ret)    # ['w']

ret = re.findall('[w,,]', 'awdb')
print(ret)     # ['w']
“^”放在[]裡面,表示取反:
ret = re.findall('[^w]', 'awdb')   # 匹配除W以外的所有字元
print(ret)  # ['a', 'd', 'b']

ret = re.findall('[^1,4]', 'a1wd42b')   # 註:取反的是(1,4) 整體
print(ret)  # ['a', 'w', 'd', '2', 'b']

4、\ 字元集

反斜杠後跟元字元去除特殊功能;反斜杠後跟普通字元實現特殊功能
"""
\d 匹配十進位數;相當於類[0-9]
\D 匹配任意非數字字元;相當於類[^0-9]
\s 匹配任意空白字元;相當於類[\t\n\r\f\v]
\S 匹配任何非空白字元;相當於類[^ \t\n\r\f\v]
\w 匹配任意字母數字字元;相當於類[a-zA-Z0-9]
\W 匹配任何人非字母數字字元;相當於類[^a-zA-Z0-9]
\b: 匹配一個特殊字元的邊界,就是單詞和空格間的位置
"""
ret = re.findall(r'\d{8}', 'qeqwe45454455qws1245')
print(ret)     # ['45454455']  只能匹配到1組,因為後面數字的不夠8位

ret = re.findall(r'\d{8}', 'qeqwe45454455qws12456541')
print(ret)      # ['45454455', '12456541']  匹配到2組,

ret = re.findall(r'\D{4}', 'qeqwe4555qws41')   # 大括弧裡面的數字4代表的是4個字元一組
print(ret)     # ['qeqw']

ret = re.findall(r'\s', 'we4 g1')         # 匹配空白符
print(ret)      # [' ']

ret = re.findall(r'\sw', 'ws4 wsg1')       # 匹配空白符加w
print(ret)      # [' w']

ret = re.findall(r'\w', 'w4 g1')   # 匹配空白符
print(ret)      # ['w', '4', 'g', '1']

ret = re.findall(r'hello\b', 'hello, you is cat? ')   # 匹配出你想要的且是一個單詞的內容
print(ret)      # ['hello']

search() 方法:     匹配出第一個滿足條件的結果

ret = re.search('lo', 'hello, youlo? ')   # 匹配出你想要的且是一個單詞的內容
print(ret)   # <_sre.SRE_Match object; span=(3, 5), match='lo'>
print(ret.group())   # lo

ret = re.search('a.', 'asd')
print(ret.group())   # as

ret = re.search(r'a\.', 'asd')   # 報錯,因為被索引字元串裡面沒有"."

print(ret.group())   # AttributeError: 'NoneType' object has no attribute 'group'

ret = re.search(r'a\.', 'a.sd')
print(ret.group())   # a.

ret = re.search(r'a\+', 'a+sd')
print(ret.group())   # a+
ret = re.search(r'\\c', r'asd\c')   # \\不加r會報錯
print(ret.group())   # \c

ret = re.search(r'\\', r'asd\c')   # \\不加r會報錯
print(ret.group())   # \

註意:加r是告訴python解釋器,\\就是原生字元,不需要轉義,就直接把2個\送給re模塊

ret = re.search('\\\\', r'asd\c')   # 等同於上面的語句,
print(ret.group())   # \c

註意:因為在python解釋器裡面\也是有特殊意義的,所以當傳入4個\時,python解釋器通過轉義,變為2個\,然後傳給re模塊;在re模塊裡面,\同樣是有特殊意義,所以把2個\轉義為1個\,然後進行匹配

5() :分組    |:或

ret = re.search('(as)+', r'asasd\c')   # 匹配括弧裡面一個組的字元,而不是單個字元
print(ret.group())   # asas

ret = re.findall(r'www.(\w+).com', 'www.123swd.com')   # 涉及到組時,只會把組裡面的內容匹配出來
print(ret)   # ['123swd']

ret = re.findall(r'www.(?:\w+).com', 'www.123swd.com')   # 加問號冒號(?:)取消組的優先順序
print(ret)   # ['www.123swd.com']

ret = re.search('(as)|', r'asd35')   # 匹配括弧裡面一個組的字元,而不是單個字元
print(ret.group())   # as

ret = re.search('(as)|3', r'asd35')   # as或3,優先匹配第一個,誰在前輸出誰
print(ret.group())   # as

ret = re.search('(as)|3', r'3as5e')
print(ret.group())   # 3

三、稍複雜一點兒的正則

ret = re.search(r'(?P<id>\d{3})', 'asdsf124c4vss7').group('id')  # 給匹配到的三個數字起一個名字,叫id;?<名字>是固定寫法
print(ret)      # 124

# 後面匹配項只能是 '數字/數字或字母' 的形式,/前的一個字元一定不能為字母
ret = re.search(r'(?P<id>\d{3})/(?P<name>\w{3})', 'wa124/bug')
print(ret.group())      # 124/bug
print(ret.group('id'))      # 124
print(ret.group('name'))    # bug

ret = re.match('asd', 'sdsasd')
print(ret)    # None

ret = re.split('s', 'qwesdc')   # 通過s對後面的字元串進行分割
print(ret)  # ['qwe', 'dc']

ret = re.split('[eh]', 'qwesdhtrc')   # 先通過e對後面的字元串進行分割,然後通過h對前面分割開的兩部分繼續分割
print(ret)  # ['qw', 'sd', 'trc']

ret = re.split('[eh]', 'hqwesdhtrc')
print(ret)  # ['', 'qw', 'sd', 'trc']   列表第一個元素為空,是因為字元串h前面沒有其他的字元

ret = re.sub('臭豬', '小baby', '雙雙是臭豬')    # ('原內容', '新內容', '對象')
print(ret)  # 雙雙是小baby

ret = re.subn('臭豬', '小baby', '雙雙是臭豬,小臭豬')    # ('原內容', '新內容', '對象'),該方法會輸出替換的次數
print(ret)  # ('雙雙是小baby,小小baby', 2)

ret = re.sub('q..s', 's..z', 'zaqwesf')    # ('原內容', '新內容', '操作對象')
print(ret)  # zas..zf


ret = re.findall(r'\.com', 'adsdas.comasdaf')
print(ret)      # ['.com']

obj = re.compile(r'\.com')   # 為了避免重覆,把規則編譯為一個對象,下次使用只需調用對象即可
ret = obj.findall('adsdas.comasdaf')   # 等價於 re.findall(r'\.com', 'adsdas.comasdaf')
print(ret)      # ['.com']

ret = re.finditer(r'\d', 'a2da7f')   # 把結果封裝為一個迭代器,既此時ret為一個迭代器
print(ret)      # <callable_iterator object at 0x000001E3DDFF1320>
print(next(ret))    # <_sre.SRE_Match object; span=(1, 2), match='2'>
print(next(ret).group())    # 2

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

-Advertisement-
Play Games
更多相關文章
  • 1.異常 當出現錯誤時,程式就會發生異常 輸入num1=3,num2=0,程式產生異常 除了除零異常,還有許多種異常: (1)異常捕獲 使用try…except…語句來捕獲異常 輸出結果: 也可以在except後面加上具體的異常 (2)處理多個異常 上面的例子不止會出現除零異常,如果我輸入的不是數字 ...
  • "知乎原鏈" 5. "Data Structures" 中的第一個常式: 大多數讀者也許都認為這些字元串和數字並沒有特別意義. 如果真是這樣, 這個常式還不如用 之類來的一目瞭然, 省去多餘的猜度. 不巧發現"guido"是Python創作者的名字(Guido van Rossum), 就覺得不該這 ...
  • 通過深入分析Spring源碼,我們知道Spring框架包括大致六大模塊, 如Web模塊,資料庫訪問技術模塊,面向切麵模塊,基礎設施模塊,核心容器模塊和模塊, 其中,在Spring框架的Web模塊中,又包含很多前端技術,如SpringMVC,Spring WebSocket,Spring WebPor ...
  • 這次項目上需要去證書中解析公鑰所以這裡分享下方法: 首先準備一個證書文件比如叫:test.crt(一般是cer結尾) 下一步準備把證書導入到導入java中的cacerts證書庫里 方法如下: 比如本地的jdk路徑是C:\Program Files\Java\jdk1.8.0_181那麼接下來我們要進 ...
  • @RequestMapping(value = "downloadExcel", method = RequestMethod.GET) public String download(HttpServletRequest request,HttpServletResponse response) t ...
  • IntelliJ IDEA安裝 IntelliJ IDEA,是java編程語言開發的集成環境,業界公認的最好的Java開發IDE之一。打開IDEA官方網站https://www.jetbrains.com/idea/download/#section=windows 選擇合適的版本進行下載,此次選擇 ...
  • 本文介紹一下Iterator和Enumeration的區別及其效率 Iterator是一個介面,它的源碼如下: Enumeration也是一個介面,它的源碼如下: 從源碼可以看出,Iterator除了能讀取集合的數據之外,也能數據進行刪除操作;而Enumeration只能讀取集合的數據,而不能對數據 ...
  • 1、萬惡的”+“號字元串拼接 字元串中的連接符+”會開闢一個新的空間,多一個“+“就會多開闢一個空間,影響性能 2、字元串格式化 ”%S“ :字元類型 ”%D“ ”數字類型 “%F” :浮點類型 3、字元串的常用操作 移除空白 strip 分割 split 長度 len 索引 obj [index] ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...