正則表達(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