Python中正則表達式講解

正則表達式是匹配字符串的強大武器,它的核心思想是給字符串定義規則,凡是符合規則的字符串就是匹配了,否則就是不合法的。在介紹Python的用法之前,我們先講解一下正則表達式的規則,然后再介紹在Python中如何運用。

如果直接給出字符,那么就是精確的匹配,例如‘abc’當然是匹配’abc’了。

  • \d可以匹配數字(0-9)
  • \D和\d相反,就是說只要不是0-9,都可以匹配
  • \w可以匹配字母或者數字(0-9|a-z|A-Z)
  • \W和\w相反,就是說只要不是字母和數字,都可以匹配
  • \s可以匹配空格,\n,\t,\r,\f
  • \S和\s相反
  • . 可以匹配除了\n以外的任意字符

第一步先說這些內容,Python提供re模塊,包含所有正則表達式的功能,看下面的程序演示:

#如何判斷正則表達式是否匹配,使用re.match()
import re
a=re.match('\d','1')
b=re.match('\d','s')
print(a)
print(b)輸出:
<_sre.SRE_Match object at 0x000000000065A510>
None

這里說一下,如果match()方法匹配的話,返回一個Match對象,否則返回None
為了方便觀察程序運行結果,我們使用if判斷來輸出結果,下面再看一個例子

import re
def is_match(a):if a!=None:print('yes!')else:print('no!')
a=re.match('\d','123abc')
b=re.match('\d\d','123abc')
c=re.match('\d\d\d','123abc')
d=re.match('\d\d\d\d','123abc')
is_match(a)
is_match(b)
is_match(c)
is_match(d)輸出:
yes!
yes!
yes!
no!

現在來講解上面的代碼,我們知道\d可以匹配一個0-9的數字,所以re.match(‘\d’,’123abc’)中的\d匹配的是字符串‘123abc’中的1,至于后面的’23abc’不用管它。一個\d我只用匹配一個數字就可以了。re.match(‘\d\d’,’123abc’)中的兩個\d分別匹配的是字符串’123abc’中的‘1’和‘2’,后面的‘3abc’不用管。re.match(‘\d\d\d\d’,’123abc’)中前3個\d分別匹配的是‘1’,‘2’,‘3’,當第4個\d去匹配‘a’的時候發現不能匹配,所以最后一個不能匹配上,輸出None。再看幾個例子體會下吧

為了減少代碼量,下面的代碼我會直接寫主要的代碼部分,輸出結果用注釋代替

a=re.match('\w','123abc') #yes
b=re.match('\w','abc123') #yes
c=re.match('\w','Abc123') #yes
a=re.match('.','abc') #yes
b=re.match('.','Abc') #yes
c=re.match('.','12bc') #yes
d=re.match('.','*2bc') #yes
e=re.match('.','\n2bc') #no

如果我們要匹配變長的字符,可以在\d,\w,\s, . 的后面使用下面的符號
* 表示任意個字符(包括0個)
+表示至少一個字符
?表示0個或1個字符
{n}表示n個字符
{n,m}表示n-m個字符

a=re.match('\d*','123') #yes
# *表示任意個字符,包括0個,所以\d*可以匹配0個數字,所以match('\d*','abc')可以匹配
b=re.match('\d*','abc') #yes
c=re.match('\d+','1abc') #yes
# +表示至少1個字符,\d+表示至少1個數字,所以匹配不成功
d=re.match('\d+','abc') #no
a=re.match('\d?','123') #yes
b=re.match('\d?','abc') #yes
c=re.match('\d{3}','1234') #yes
#\d{3}代表3個數字,而'12'只有2個,所以不匹配
d=re.match('\d{3}','12') #no
#'12abc'前3個'12a'不全是數字
e=re.match('\d{3}','12abc') #no
a=re.match('\d{0,3}','abc') #yes
b=re.match('\d{0,3}','12abc') #yes
c=re.match('\d{0,3}','1234bc') #yes

還有更加精確的匹配,用[ ]表示范圍,例如:
[0-9]匹配1個數字,和\d一樣
[a-z]匹配1個小寫字母
[A-Z]匹配1個大寫字母
\ _匹配下劃線
[0-9a-zA-Z]可以匹配1個數字或者字母,等價于\w
[0-9a-zA-Z\ _]可以匹配1個數字或者字母或者下劃線,一般是變量的命名規則
[0-9] | [a-z]匹配1個數字或者小寫字母,使用的是 | 符號
^表示以什么開頭,例如^[0-9]就是以數字開頭
$表示以什么結尾

a1=re.match('[0-9]','123') #yes
a2=re.match('[a-z]','abc') #yes
a3=re.match('[A-Z]','Abc') #yes
a4=re.match('[0-9a-zA-Z]','Abc') #yes
b1=re.match('[0-9a-zA-Z]','12bc') #yes
b2=re.match('[0-9a-zA-Z]','abc') #yes
b3=re.match('[0-9a-zA-Z]','張康abc') #no
b4=re.match('[0-9a-zA-Z\_]','_abc') #yes
a=re.match('^[0-9a-zA-Z\_][0-9]','a1bc') #yes
b=re.match('^[0-9a-zA-Z\_][a-z]','Abc') #yes
c=re.match('^[0-9a-zA-Z\_][A-Z]','1Bbc') #yes
d=re.match('^[0-9a-zA-Z\_][0-9]','1abc') #no
e=re.match('^[0-9a-zA-Z\_]','_1bc') #yes
a=re.match('^[0-9a-z]+[A-Z]$','1234A') #yes
b=re.match('^[0-9a-z]+[A-Z]$','1234a') #no

正則表達式還可以用來切分字符串(切分字符串)

import re
a=re.split('\s+','a  b c')
print(a)輸出:
['a', 'b', 'c']

關于字符串中的split()函數,不明白的請參考我的另一篇博文。上面的代碼的意思是以空格為切分符,把字符串分成n段,并以list的形式返回。
如果還想把逗號加進去,讓空格和逗號都變成分隔符,看下面的代碼:

import re
a=re.split('[\s\,]+','a  b c     ,d,f    e')
print(a)輸出:
['a', 'b', 'c', 'd', 'f', 'e']

正則表達式還可以用來提取子串(分組)

用( )表示的就是要提取的分組(Group),把想要提取的子串在正則表達式中用( )括起來,例如我要提取帶區號的固定電話號的每一部分,看代碼演示:

import re
a=re.match('(\d{4})\-(\d{7})','0370-5163700')
g0=a.group(0)
g1=a.group(1)
g2=a.group(2)
print(g0)
print(g1)
print(g2)輸出:
0370-5163700
0370
5163700

\d{4}匹配的是0370,因為我要提取它,所以用()括起來,代表一個分組
\ - 匹配的是 - ,因為這里 - 是特殊字符,需要轉義,就像下劃線需要轉義\ _,這里我不需要提取這個 - ,所以不用加括號。
\d{7}匹配的是5163700,這是需要提取的第二個分組,所以需要括起來。
還有一點需要注意,無論什么時候,group(0)提取的都是原來的字符串,你要提取的分組從group(1)開始。

正則表達式的貪婪匹配

正則表達式匹配默認是貪婪匹配,也就是匹配盡可能多的字符,看個例子吧!

import re
a=re.match('^(\d+)(1*)$','12345611111')
print('第一組:'+a.group(1))
print('第二組:'+a.group(2))輸出:
第一組:12345611111
第二組:

按照正常的理解\d+應該匹配123456,1*匹配11111,但是由于正則表達式是默認貪婪匹配,\d+匹配了全部數字。怎么才能不讓它貪婪匹配呢,很簡單,在后面加個問號?就可以了

import re
a=re.match('^(\d+?)(1*)$','12345611111')
print('第一組:'+a.group(1))
print('第二組:'+a.group(2))輸出:
第一組:123456
第二組:11111

編譯

在Python中使用正則表達式時,re模塊內部會干兩件事情:

  1. 編譯正則表達式,如果正則表達式的字符串本身不合法,會報錯;
  2. 用編譯后的正則表達式去匹配字符串。

在編寫網站的時候,有可能我們會對用戶注冊時輸入的用戶名或者郵箱等進行正則驗證,那么一個正則表達式可能會匹配成千上萬個用戶名或者郵箱,每次都需要先編譯后匹配,那么效率顯得很低。那么為了提高效率,我們可以先編譯正則表達式,只需要編譯一次,然后用的時候再匹配。

import re
#由字母或者下劃線開頭,由數字,字母,下劃線組成長度為6-20的字符串
re_c=re.compile('^[a-zA-Z\_][\w\_]{5,19}$')
print(re_c.match('a123456789a123456789'))輸出:
<_sre.SRE_Match object at 0x000000000065A510>

編譯后生成Regular Expression對象,由于該對象自己包含了正則表達式,所以調用對應的方法時不用再次給出正則串。

以上的內容只是正則表達式的九牛一毛,關于其他的正則表達式用法請讀者自己查閱,如讀者發現錯誤,歡迎指正。

轉載于:https://www.cnblogs.com/neuzk/p/9476429.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253090.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253090.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電源適配器上各符號的意義都清楚嗎?

現在家里的電子產品是越來越多了&#xff0c;比如&#xff1a;手機、平板、筆記本、智能電視、智能音箱、路由器、剃須刀等&#xff1b;機身或者充電器上都有很多符號標志。 有沒有好奇過或者被小孩詢問過&#xff0c;這些符號標志都是什么意思呢&#xff1f;只有讀懂這些符號…

蘇寧海量服務器自動化配置運維實踐

運維的演進 人力運維階段 在IT產業的早期&#xff0c;服務器運維是通過各種Ad Hoc命令或者Shell腳本來完成基礎設施的自動化工作&#xff0c;這種方式對于簡單&#xff0c;一次性的工作很方便&#xff0c;但是對于復雜和長期的項目&#xff0c;后期的腳本維護非常麻煩。自動化工…

JS小技巧

JS操作偽元素 CSS代碼&#xff1a; #myId:before {content: "hello world!";display: block;width: 100px;height: 100px;background: red; } JS 代碼&#xff1a; var myIdElement document.getElementById("myId"); var beforeStyle window.getCompute…

流媒體服務器

1 引言   隨著互聯網的飛速發展,流媒體技術的應用越來越廣泛,從網上廣播、電影播放到遠程教學以及在線的新聞網站等都用到了流媒體技術。但現有公開文獻所報道 的大多是利用現有的流媒體服務器來搭建一個流媒體服務系統&#xff0c;或者是針對流媒體數據的編碼方式所進行的…

試產機器發現元器件損毀 風險排查過程

產品在試產階段或者公測階段&#xff0c;發現有個別機器功能異常&#xff0c;研發定位為個別元器件損壞&#xff1b; 定位過程大致有如下步驟&#xff1a; A-故障現象復現 B-輸入輸出檢查 C-電源及管腳狀態測量 D-交叉驗證 E-基本外觀觀察和特性測量 然后將器件郵寄給原…

騰訊面試經驗2

時間&#xff1a;2017年10月16日11:30面試。 地點&#xff1a;重慶萬達艾美酒店。 信息&#xff1a;女&#xff0c;本科應屆生&#xff0c;面試后臺開發崗位。 在深圳的面試已經全部結束了&#xff0c;偶然間聽朋友說重慶、長沙等場地的面試還在進行中&#xff0c;只要修改面試…

簡易有效Api接口防攻擊策略

API&#xff08;Application Programming Interface&#xff0c;應用程序編程接口&#xff09;是一些預先定義的函數&#xff0c;目的是提供應用程序與開發人員基于某軟件或硬件得以訪問一組例程的能力&#xff0c;而又無需訪問源碼&#xff0c;或理解內部工作機制的細節。 簡單…

CSS 如何設置垂直居中

1、水平居中我們都知道&#xff0c;可以直接用&#xff1a; margin:0 auto; 2、垂直居中&#xff0c;需要做一點小小的計算&#xff0c;關鍵代碼如下&#xff1a; height: 600px; position: absolute; top: 50%; margin-top:-300px; 如需水平且垂直居中&#xff1a; height: 60…

被稱為海淀媽媽四大神器之一的傾聽者K3 硬件拆解

暑假期間發現很多博主都在推薦傾聽者K3&#xff0c;被海淀媽媽們稱為四大神器之一&#xff0c; 雖然暫沒聽說其他三大神器是什么&#xff0c;作為教育硬件愛好者還是決定先整個回來拆拆看。 在京東上搜到傾聽者K3版本一共有三種顏色&#xff0c;分別是藍色&#xff08;悟空藍&…

有名信號量sem_open和內存信號量sem_init創建信號量的區別

有名信號量sem_open和內存信號量sem_init創建信號量的區別 分類&#xff1a; C/C sem_t *sem sem_open(const char *name, int oflag, .../*mode_t mode,unsinged int value) ;int sem_init(sem_t *sem,int shared, unsigned int value);區別&#xff1a;1.創建有名信號量必須…

KVM虛擬機相關步驟

KVM是Kernel-based Virtual Machine的簡稱&#xff0c;是一個開源的虛擬化模塊&#xff0c;該文檔是基于CentOS 7.4環境操作的 一、操作系統安裝 本文采用的是CentOS 7.4 1、查看系統版本 cat /etc/redhat-release 2、系統更新 Yum makecache &&yum update && …

dds設計信號發生器

高一 150206101 Dds數字信號發生器設計方案 DDS的工作原理框圖如下 在微機內&#xff0c;若插入一塊D/A轉換卡&#xff0c;然后編制一段小程序&#xff0c;如連續進行加一運算到一定值&#xff0c;然后連續進行減一 運算回到原值&#xff0c;在反復運行該程序&#xff0c;則微機…

Maven--資源文件resource的問題

2019獨角獸企業重金招聘Python工程師標準>>> Maven項目的目錄有&#xff1a; src/java/main src/java/resource src/test/main src/test/resource 有的時候在resource目錄下添加文件卻不能加載出來&#xff0c;解決的辦法是從把添加的資源文件添加到properties---&g…

pthread_create()創建線程最大個數

線程應用程序最常見導致創建線程失敗的原因是線程棧大小的設置。創建一個新的線程&#xff0c;默認情況下系統為線程棧預留了2MB的尋址空間。線程棧起始于進程虛擬 內存的高端地址&#xff0c;并向虛擬內存底端地址方向擴展。取決于線程本身的大小以及其它線程內存分配的情況&a…

C++ Primer 5 CH4 表達式

4.1 基礎 函數調用也是一種特殊的運算符&#xff0c;它對運算對象的數量沒有限制。C 的表達式要么是左值&#xff0c;要么是右值。左值可以位于賦值語句的左邊&#xff0c;右值則不可以。當一個對象被用作右值的時候&#xff0c;用的是對象的值&#xff1b;當對象被用作左值的時…

PHY以太網自動協商原理

自協商原理&#xff1a;自協商是通過一種叫做快速連接脈沖&#xff08;Fast Link Pulse&#xff09;的信號實現的&#xff0c;簡稱FLP。自協商的雙方通過FLP來交換數據。 在具備自協商能力的端口沒有Link的情況下&#xff0c;端口一直發送FLP&#xff0c;在FLP中包含著…

canvas--初級

摘要&#xff1a; canvas:默認寬高為300*150&#xff0c;需用canvas的API定義其寬高繪畫路徑以beginPath()開始,以closePath()結束常用方法fill()、stroke()、rect()、arc()、text()、lineTo()、moveTo()以下為代碼&#xff1a; var cdocument.getElementById("mycanvas&q…

撲克牌翻牌問題(遞歸)

撲克牌翻牌問題 題目描述&#xff1a; 有52張牌&#xff0c;使它們全部正面朝上&#xff0c;從第2張開始&#xff0c;凡是2的倍數位置上的牌翻成正面朝下&#xff1b;接著從第3張牌開始&#xff0c;凡是3的倍數位置上的牌&#xff0c;正面朝上的翻成正面朝下,正面朝下的翻成正面…

以太網自動協商原理

自協商基本原理 自動協商模式是端口根據另一端設備的連接速度和雙工模式&#xff0c;自動把它的速度調節到最高的公共水平&#xff0c;即線路兩端能具有的最快速度和雙工模式。 自協商功能允許一個網絡設備能夠將自己所支持的工作模式信息傳達給網絡上的對端&#xff0c;并接受…

Python學習-文件的調用-讀取

1.文件的打開 open(filename[,mode[,buffering]]) #這個一定要記得關文件。close.() filename,要以路徑的形式展示&#xff0c;比如在"c:\"中&#xff0c;則要這樣寫: rc:\filename 如果不用路徑展示&#xff0c;那就用filename.其會在執行文件所在的文件夾進行搜索…