Python學習日記(十四) 正則表達式和re模塊

来源:https://www.cnblogs.com/Fantac/archive/2019/08/23/11403187.html
-Advertisement-
Play Games

正則表達式: 它是字元串的一種匹配模式,用來處理字元串,可以極大地減輕處理一些複雜字元串的代碼量 字元組:它是在同一位置可能出現的各種字元組成了一個字元組,用[]表示,但是它的結果只能是一個數字或者一個大寫字母或小寫字母等 下麵測試以該網站為例http://tool.chinaz.com/regex ...


正則表達式:

它是字元串的一種匹配模式,用來處理字元串,可以極大地減輕處理一些複雜字元串的代碼量

字元組:它是在同一位置可能出現的各種字元組成了一個字元組,用[]表示,但是它的結果只能是一個數字或者一個大寫字母或小寫字母等

下麵測試以該網站為例http://tool.chinaz.com/regex/

#正則表達式              匹配字元串              匹配結果
#[0-9]                     9                     9       [0-9]的寫法就相當於在用[0123456789]
#[0123456789]              0                     0
#[a-z]                     1                    None     這裡只匹配小寫字元a-z而不匹配數字
#[a-z]                     z                     z
#[A-Z]                     A                     A       這裡只匹配大寫字元串
#[A-Z0-5a-c]              A6b                   A、b     這裡的數字範圍只有到0-5所以沒匹配到6

元字元:

1.'.' 匹配除換行符以外的任意字元

#正則表達式              匹配字元串               匹配結果
#    .                     a                     a  
#    .                     1                     1
#    .                     &                     &
#    .                   換行符                  None 

2.'\w' 匹配字母或下劃線或數字--word

等價於[A-Z0-9a-z_]

#正則表達式              匹配字元串               匹配結果
#    \w                    a                     a
#    \w                    1                     1
#    \w                    &                    None
#    \w                  換行符                  None
#    \w                    _                     _

3.'\s' 匹配任意的空白符--space

匹配字元串如果什麼都不寫也會匹配到一個結果,這裡的空白符有空格、tab鍵、回車等空白字元

4.'\d' 匹配任意的數字--digit

等價於[0-9]

#正則表達式              匹配字元串             匹配結果
#    \d                    a                  None
#    \d                    1                   1
#    \d                    &                  None

5.'\W' 匹配非字母或數字下劃線

和'\w'的結果相反,且空白字元也可以匹配,如果用[\w\W]就相當於全局匹配的效果;等價於[^A-Z0-9a-z_]

6.'\D' 匹配非字元

和'\d'的結果相反,且空白字元也可以匹配;等價於[^0-9]

7.'\S' 匹配非空白字元

和'\s'的結果相反,除了空白字元串其他都匹配

8.'\n' 匹配一個換行符

9.'\t' 匹配一個製表符(tab)

10.'\b' 匹配一個單詞的結尾

#正則表達式              匹配字元串             匹配結果
#    .\b                  abx                  x        匹配一個字元並返回它的末尾字元
#    b\b                  abb                  b        匹配一個字元串如果它的結尾是b就返回
#    b\b                  aaa                 None

11.'\f' 匹配一個換頁符

12.'\r' 匹配一個回車符

13.'\v' 匹配一個垂直製表符

14.'\B' 匹配一個非單詞邊界

#正則表達式              匹配字元串             匹配結果
#    v\B                  vers                 v
#   ve\B                  vers                 ve
#    s\B                  vers                None

15.'\num' 匹配一個正整數

#正則表達式              匹配字元串             匹配結果
#   (.)\1                 1122               11、22        匹配連續相鄰的兩個字元

16.'^' 匹配字元串開始

相當於startswith()

#正則表達式              匹配字元串             匹配結果
#  ^[A-Z]                A456A                 A

17.'$' 匹配字元串結束

相當於endswith()

#正則表達式              匹配字元串             匹配結果
#  [A-Z]$                 ASD                  D

18.'a|b' 匹配字元串a或b

先看左邊符不符合條件,若符合則優先匹配左邊,否則匹配右邊

#正則表達式              匹配字元串             匹配結果
#  123|5               789a12352              123、5
#(ab|c)[0-9]            5ac5ab6              c5、ab6

19.'()' 匹配括弧內的表達式也表示一個組

如果要匹配左括弧'('就要用'\('語法,右括弧')'就要用'\)'

#正則表達式              匹配字元串             匹配結果
#  ([a-z])               aswss            a、s、w、s、s

20.'[...]' 匹配字元組的字元

21.‘[^...]’匹配除了字元組中字元的所有字元

#正則表達式              匹配字元串             匹配結果
#  [^abc]               erasdbc            e、r、s、d

量詞:

用於約束前一個正則匹配的規則,要放在規則的後面

1.'*' 重覆零次或多次

0次就是不是正則表示里需要的元素也會算一次

#正則表達式              匹配字元串             匹配次數
#   [a]*                abaacaaa               6
#  [a-z]*                 abc                  2
#   []*                                        1

2.'+' 重覆一次或更多次

#正則表達式              匹配字元串           匹配次數
#   [a]+                abaacaaa               3
#  [a-z]+                 abc                  1
#   []+                                        0

3.'?' 重覆零次或一次

#正則表達式              匹配字元串           匹配次數
#   [a]?               abaacaaa              9
#  [a-z]?                abc                  4
#   []?                                       1

4.'{n}' 重覆n次

5.'{n,}' 重覆n次或更多次

6.'{n,m}' 重覆n次到m次

#正則表達式              匹配字元串             匹配次數            匹配結果
# [a]{2,5}           aaaaaaaaaaaaa             3           aaaaa、aaaaa、aaa
#[a]{2,5}?           aaaaaaaaaaaaa             6         aa、aa、aa、aa、aa、aa        ?放在最後的作用是取最小的次數

用法註意:

1..^$

#正則表達式              匹配字元串             匹配結果
#    a.                 abacadaf          ab、ac、ad、af       匹配以a為開頭的字元串
#   ^a.                 abacadaf               ab             只匹配一個從字元串中以a開頭的字元串
#   a.$                 abacadaf               af             只匹配一個從字元串中以a結尾的字元串

2.*+?{ }

#正則表達式              匹配字元串             匹配結果
#   一.?             一二一二三一二三四      一二、一二、一二     匹配一後面的一個任意字元
#   一.*             一二一二三一二三四     一二一二三一二三四     匹配一後面的0或多個任意字元   
#   一.+             一二一二三一二三四     一二一二三一二三四     匹配一後面的1或多個任意字元
# 一.{2,4}           一二一二三一二三四     一二一二三、一二三四    匹配一後面2-4個字元
# 一.{2,4}?          一二一二三一二三四       一二一、一二三     匹配一後面2個字元

*+?的匹配規則都屬於貪婪匹配,即儘可能多的匹配,而在規則的最後加?會變成惰性匹配,即儘可能少的匹配

3.字元集[ ][^]

#正則表達式              匹配字元串              匹配結果
#  a[bcd]*            ab|abc|abcd          ab、abc、abcd
#  a[^|]*             ab|abc|abcd          ab、abc、abcd
#   [\d]               123a56bc            1、2、3、5、6
#   [\d]+              123a56bc               123、56

4.轉義符\

#正則表達式              匹配字元串              匹配結果
#    \n                   \n                   None
#   \\n                   \n                    \n         這裡的第一個\充當轉義的作用
#  \\\\n                 \\n                   \\n         每需要轉義一個\都要在前面寫一個\
#  r\\\\n                r\n                   r\n         加r會讓整個結果不轉義

5.非貪婪匹配

#正則表達式              匹配字元串               匹配結果
# a[a-z]*?              aaaaaaa         a、a、a、a、a、a、a(7次)
# a[a-z]+?              aaaaaaa             aa、aa、aa(3次)
# a[a-z]??              aaaaaaa         a、a、a、a、a、a、a(7次)
#a[a-z]{2,4}?           aaaaaaa              aaa、aaa(2次)
#a[a-z]{2,}?            aaaaaaa              aaa、aaa(2次)

'.*?x’的作用是直到找到x就停止

#正則表達式              匹配字元串               匹配結果
#  .*?a              45bjswakaabaa      45bjswa、ka、a、ba、a

6.身份證號是一個長度為15或18的字元串,如果是15位則全部是數字組成,首位不能為0,如果18位,則前17位全是數字,末尾可能是x或數字

#            正則表達式                         匹配字元串                     匹配結果
#^([1-9]\d{16}[0-9x]|[1-9]\d{14})$       122345688989788                122345688989788
#^([1-9]\d{16}[0-9x]|[1-9]\d{14})$      12234568898978811x             12234568898978811x

 

re模塊:

常用方法:

1.findall()

返回所有滿足匹配條件的結果並放在一個列表中

import re
ret = re.findall('[a-z0-9]','aAbBcC123&')
print(ret)                                          #['a', 'b', 'c', '1', '2', '3']

優先順序:

這裡的問號具有取消分組優先順序的作用

import re
ret = re.findall('www.(baidu|google).com', 'www.google.com')
print(ret)      #['google']
ret = re.findall('www.(?:baidu|google).com', 'www.google.com')
print(ret)      #['www.google.com']

2.search()

在字元串中從左到右找到一個符合匹配標準的就返回一個對象,如果ret沒有匹配到就返回None

import re
ret = re.search('[a]+','12aaa78a8aa')
print(ret)                  #<re.Match object; span=(2, 5), match='aaa'>
print(ret.group())          #aaa
ret2 = re.search('[A-Z]+','12aaa78a8aa')
print(ret2)                 #None
print(ret2.group())         #AttributeError: 'NoneType' object has no attribute 'group'

增加一個判斷,如果有匹配成功就返回匹配的字元串,沒成功就不執行

import re
ret = re.search('[a]+','12aaa78a8aa')
if ret:
    print(ret.group())      #aaa

註意:

import re
ret = re.search('^[0-9](\d{5})(\d{2})?$','11534512')
print(ret.group())      #11534512
print(ret.group(1))     #15345    拿到每一個分組的數值
print(ret.group(2))     #12

3.match()

這個方法就是從開頭開始匹配,如果正則規則能夠匹配的上開頭,那麼就返回一個對象,結果中的內容要group()方法才能顯示,如果沒有匹配上就返回None,調用group()就會報錯

import re
ret = re.match('[0-9a-z]+','abc123A33a')                                 
print(ret)                  #<re.Match object; span=(0, 6), match='abc123'>
if ret: 
    print(ret.group())      #abc123

4.split()

先按'a'分割得到''和'bcd',再對''和'bcd'分別按'b'分割得到''和'cd',分割完的字元會消失

import re
ret = re.split('[ab]','abcd')
print(ret)               #['', '', 'cd']

優先順序:

import re
ret1 = re.split('\d+','abc1abcsw22asww3312a')
print(ret1)             #['abc', 'abcsw', 'asww', 'a']
ret2 = re.split('(\d+)','abc1abcsw22asww3312a')
print(ret2)             #['abc', '1', 'abcsw', '22', 'asww', '3312', 'a']     加上了括弧之後能夠保留匹配項,沒加括弧則不保留匹配項

5.sub()

將正則規則匹配到的英文小寫字母替換成'&',後面的5表示只替換5次

import re
ret = re.sub('[a-z]','&','eva3sdww4asd22H3',5)
print(ret)              #&&&3&&ww4asd22H3

6.subn()

和sub執行效果幾乎相同,結果會返回替換後的字元串和替換次數

import re
ret = re.subn('[a-z]','&','eva3sdww4asd22H3',5)
print(ret)               #('&&&3&&ww4asd22H3', 5)

7.compile()

當一個正則規則需要被反覆的調用且它的正則表達式很長,它就需要用到compile()

import re
obj = re.compile('\d{3,5}')     #將正則表達式編譯成一個正則表達式對象,規則要匹配3-5個數字
ret = obj.search('abc12gha12432j1222')
print(ret.group())              #12432
ret = obj.search('easda22132aasdw22sdaw')
print(ret.group())              #22132

8.finditer()

結果可以返回一個存放結果的迭代器

import re
ret = re.finditer('[a-z]{2,3}','12abs23saw7a8sddw')
print(ret)                   #<callable_iterator object at 0x00000000027A2160>
print([i.group() for i in ret])     #['abs', 'saw', 'sdd']

9.分組命名

import re
ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>page</h1>")   #在分組中利用?<name>的形式給分組取名字
print(ret.group('tag_name'))        #h1    
print(ret.group())                  #<h1>page</h1>
import re
ret = re.search(r"<(\w+)>\w+</\1>","<h1>page</h1>")                #在分組中不想寫名字的話可以用\序號來找到對應的組,表示要找的內容和前面組內容一致
print(ret.group(1))     #h1
print(ret.group())      #<h1>page</h1>

10.flags參數

re.I(IGNORECASE):忽略大小寫,括弧內是完整的寫法
re.M(MULTILINE):多行模式,改變^和$的行為
re.S(DOTALL):點可以匹配任意字元,包括換行符
re.L(LOCALE):做本地化識別的匹配,表示特殊字元集 \w, \W, \b, \B, \s, \S 依賴於當前環境,不推薦使用
re.U(UNICODE):使用\w \W \s \S \d \D使用取決於unicode定義的字元屬性。在python3中預設使用該flag
re.X(VERBOSE):冗長模式,該模式下pattern字元串可以是多行的,忽略空白字元,並可以添加註釋

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

-Advertisement-
Play Games
更多相關文章
  • 1. ...
  • 這次分享我們就來談談單例模式的使用,其實在本公眾號設計模式的第一篇分享就是單例模式,為什麼又要討論單例模式了?主要是那篇文章談的比較淺,只對單例模式的主要思想做了一個分享,這篇文章會從多個方面去分享單例模式的使用,下麵進入正題。 使用Java做程式的小伙伴都知道單例,尤其是使用spring框架做項目 ...
  • 本文將介紹微服務架構和相關的組件,介紹他們是什麼以及為什麼要使用微服務架構和這些組件。本文側重於簡明地表達微服務架構的全局圖景,因此不會涉及具體如何使用組件等細節。 為了防止不提供原網址的轉載,特在這裡加上原文鏈接: "https://www.cnblogs.com/skabyy/p/1139657 ...
  • 代碼參考:https://github.com/HCJ shadow/Zuul Gateway Cluster Nginx Zuul的路由轉發功能 前期準備 搭建Eureka服務註冊中心 服務提供者msc provider 5001【提供一個hello請求做測試】 創建gateway 7001 p ...
  • 一、複習 1.標識符(自己定義的,下劃線、美元符號) 2.駝峰命名(變數名,方法名首字母小寫) 3.關鍵字(就是固定的那幾個) 4.字面值(數據、有類型、八種基本類型從小到大,byte\char=short\int\long\float\double\boolean 5.成員變數(初始化在方法外且不 ...
  • 23:59 2019/8/23 成員變數: 對象的成員變數,或者普通成員變數; 類的成員變數,或者靜態成員變數 下麵是source code和.class->.java(反編譯後)的source code ...
  • 功能需求:在前端頁面中,for迴圈id會構不成連續的順序號,所以要找到一種偽列的方式來根據數據量定義序號 因此就用到了在前端頁面中的一個欄位 forloop.counter,完美解決 ...
  • 集合系列(一):集合框架概述 Java 集合是 Java API 用得最頻繁的一類,掌握 Java 集合的原理以及繼承結構非常有必要。總的來說,Java 容器可以劃分為 4 個部分: List 集合 Set 集合 Queue 集合 Map 集合 除了上面 4 種集合之外,還有一個專門的工具類: 工具 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...