day30(正則表達(dá)式)

正則表達(dá)式

正則表達(dá)式,又稱正規(guī)表示式、正規(guī)表示法、正規(guī)表達(dá)式、規(guī)則表達(dá)式、常規(guī)表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),是計算機科學(xué)的一個概念。正則表達(dá)式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串。在很多文本編輯器里,正則表達(dá)式通常被用來檢索、替換那些匹配某個模式的文本。

Regular Expression的“Regular”一般被譯為“正則”、“正規(guī)”、“常規(guī)”。此處的“Regular”即是“規(guī)則”、“規(guī)律”的意思,Regular Expression即“描述某種規(guī)則的表達(dá)式”之意。

re模塊

在Python中需要通過正則表達(dá)式對字符串進行匹配的時候,可以使用一個模塊,名字為re。

re.match是用來進行正則匹配檢查的方法,若字符串匹配正則表達(dá)式,則match方法返回匹配對象(Match Object),否則返回None(注意不是空字符串"")。

匹配對象Macth Object具有g(shù)roup方法,用來返回字符串的匹配部分。

import re

#match從開頭匹配,如果沒有返回None

ret = re.match('w','www.baidu.com')

print(ret)

print(ret.group())

表示字符

.點匹配任意一個字符

[]匹配[]里邊任意一個字符

\d匹配一個數(shù)字

\D匹配一個非數(shù)字

\s匹配一個空白,空格 Tab鍵

\S匹配一個非空白

\w匹配一個單詞字符,中文,A-Z,a-z,0-9,_

\W匹配一個非單詞字符,中文,A-Z,a-z,0-9,_

[\u4e00-\u9fa5]中文

\表示轉(zhuǎn)義

r只對\有用

例如:

import re

#.點匹配任意一個字符

ret = re.match('.','1www.baidu.com')

print(ret)

print(ret.group())

表示數(shù)量

*匹配前一個字符出現(xiàn)0次或者無限次

?+匹配前一個字符出現(xiàn)1次或者無限次

??匹配前一個字符出現(xiàn)1次或者0次

?{m}匹配前一個字符出現(xiàn)m次

?{m,}匹配前一個字符至少出現(xiàn)m次

?{m,n}匹配前一個字符出現(xiàn)m到n次

例如:

import re

ret = re.match(r'e*','ererrtrrfdgwc:\\a\\b')

print(ret)

print(ret.group())

表示邊界:

^匹配字符串開頭

$匹配字符串結(jié)尾

\b匹配字符串邊界

\B匹配非字符串邊界

例如:

import re

#^匹配字符串開頭

ret = re.search(r'^err','errderrtrrfdgwc:\\a\\b')

print(ret)

print(ret.group())

匹配分組

[^a-z]表示除了a-z

|匹配左右任意一個表達(dá)式

(ab)將括號中字符作為一個分組

\num引用分組序號num匹配到的字符串

(?P)給分組起別名

(?P=name)引用別名為name的分組匹配到的字符串

例如:

import re

#(?P)給分組起別名

ret = re.match(r'<(?P\w+)>(\w+)','haha')

print(ret)

print(ret.group(1))

print(ret.group(2))

re模塊的高級用法

match 方法:從起始位置開始查找,一次匹配

search 方法:從任何位置開始查找,一次匹配

findall 方法:全部匹配,返回列表

finditer 方法:全部匹配,返回迭代器

split 方法:分割字符串,返回列表

sub 方法:替換

貪婪和非貪婪

Python里數(shù)量詞默認(rèn)是貪婪的(在少數(shù)語言里也可能是默認(rèn)非貪婪),總是嘗試匹配盡可能多的字符;

非貪婪則相反,總是嘗試匹配盡可能少的字符。

在"*","?","+","{m,n}"后面加上?,使貪婪變成非貪婪。

import re

#貪婪和非貪婪

pattern = re.compile(r'(.+)(\d+-\d+-\d+-\d+)')

ret = pattern.match('This is a number 234-235-22-423')

print(ret)

print(ret.group())

print(ret.group(1))

print(ret.group(2))

print('*****************************')

pattern = re.compile(r'(.+?)(\d+-\d+-\d+-\d+)')

ret = pattern.match('This is a number 234-235-22-423')

print(ret)

print(ret.group())

print(ret.group(1))

print(ret.group(2))

結(jié)果:

<_sre.SRE_Match object; span=(0, 31), match='This is a number 234-235-22-423'>

This is a number 234-235-22-423

This is a number 23

4-235-22-423

*****************************

<_sre.SRE_Match object; span=(0, 31), match='This is a number 234-235-22-423'>

This is a number 234-235-22-423

This is a number

234-235-22-423

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容