日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python中正则表达式讲解

發(fā)布時間:2023/12/13 python 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中正则表达式讲解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

如果直接給出字符,那么就是精確的匹配,例如‘a(chǎn)bc’當(dāng)然是匹配’abc’了。

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

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

#如何判斷正則表達(dá)式是否匹配,使用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
為了方便觀察程序運(yùn)行結(jié)果,我們使用if判斷來輸出結(jié)果,下面再看一個例子

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!

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

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

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個數(shù)字,所以match('\d*','abc')可以匹配 b=re.match('\d*','abc') #yes c=re.match('\d+','1abc') #yes # +表示至少1個字符,\d+表示至少1個數(shù)字,所以匹配不成功 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個數(shù)字,而'12'只有2個,所以不匹配 d=re.match('\d{3}','12') #no #'12abc'前3個'12a'不全是數(shù)字 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個數(shù)字,和\d一樣
[a-z]匹配1個小寫字母
[A-Z]匹配1個大寫字母
\ _匹配下劃線
[0-9a-zA-Z]可以匹配1個數(shù)字或者字母,等價于\w
[0-9a-zA-Z\ _]可以匹配1個數(shù)字或者字母或者下劃線,一般是變量的命名規(guī)則
[0-9] | [a-z]匹配1個數(shù)字或者小寫字母,使用的是 | 符號
^表示以什么開頭,例如^[0-9]就是以數(shù)字開頭
$表示以什么結(jié)尾

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

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

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

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

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

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

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

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,因?yàn)槲乙崛∷?#xff0c;所以用()括起來,代表一個分組
\ - 匹配的是 - ,因?yàn)檫@里 - 是特殊字符,需要轉(zhuǎn)義,就像下劃線需要轉(zhuǎn)義\ _,這里我不需要提取這個 - ,所以不用加括號。
\d{7}匹配的是5163700,這是需要提取的第二個分組,所以需要括起來。
還有一點(diǎn)需要注意,無論什么時候,group(0)提取的都是原來的字符串,你要提取的分組從group(1)開始。

正則表達(dá)式的貪婪匹配

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

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

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

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

編譯

在Python中使用正則表達(dá)式時,re模塊內(nèi)部會干兩件事情:

  • 編譯正則表達(dá)式,如果正則表達(dá)式的字符串本身不合法,會報錯;
  • 用編譯后的正則表達(dá)式去匹配字符串。
  • 在編寫網(wǎng)站的時候,有可能我們會對用戶注冊時輸入的用戶名或者郵箱等進(jìn)行正則驗(yàn)證,那么一個正則表達(dá)式可能會匹配成千上萬個用戶名或者郵箱,每次都需要先編譯后匹配,那么效率顯得很低。那么為了提高效率,我們可以先編譯正則表達(dá)式,只需要編譯一次,然后用的時候再匹配。

    import re #由字母或者下劃線開頭,由數(shù)字,字母,下劃線組成長度為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對象,由于該對象自己包含了正則表達(dá)式,所以調(diào)用對應(yīng)的方法時不用再次給出正則串。

    以上的內(nèi)容只是正則表達(dá)式的九牛一毛,關(guān)于其他的正則表達(dá)式用法請讀者自己查閱,如讀者發(fā)現(xiàn)錯誤,歡迎指正。

    轉(zhuǎn)載于:https://www.cnblogs.com/neuzk/p/9476429.html

    總結(jié)

    以上是生活随笔為你收集整理的Python中正则表达式讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。