簡介: 正則表達式本身是一個小型的、高度專業化的編程語言,而在python中,通過內嵌集成re模塊,我們可以通過直接調用來實現正則匹配。 正則表達式基礎知識: --普通字元匹配自身 abc abc --元字元 . :匹配任何字元(\n)換行符除外例:a.a aba \ :轉義字元例:a\tb a b ...
簡介:
正則表達式本身是一個小型的、高度專業化的編程語言,而在python中,通過內嵌集成re模塊,我們可以通過直接調用來實現正則匹配。
正則表達式基礎知識:
--普通字元
匹配自身 abc ----abc
--元字元
. :匹配任何字元(\n)換行符除外
例:a.a -----aba
\ :轉義字元
例:a\tb ---a b
* :匹配前一個字元0或多次
例:a*b ----aaaab;b
+ :匹配前一個字元1次或多次
例:a+b ----aaaab;ab
? :匹配一個字元0次或1次
例:a?b ---b;ab
^ :匹配字元串開頭,多行匹配每一行開頭
例:^ab ---ab
$ :匹配字元串末尾,多行匹配每一行末尾
例:ab$ ---ab;cb
reg1 | reg2 :匹配正則表達式reg1或reg2
例:foo | bar ---foo;bar
{} : a{m}匹配字元m次,a{m,n}匹配字元m至n次,若省略n,則匹配m至無限次
例:a{1,2}b ---aab
[] :字元集,對應的位置可以是字元集中任意字元。字元集中的字元可以逐個列出,也可以給出範圍,如[^abc]表示取反,即非abc.
註:所有特殊字元在字元集中都失去其原有的特殊含義。用\反斜杠轉義恢復特殊含義。
例:a[bcd]e ---abcde
() :最基本的組是由一對圓括弧括起來的正則式。
例:(abc){2}a(2|4)d ---abcabca4d
--特殊字元
\d :數字1~9
例:a\db ---a1b
\D:非數字[^\d]
例:a\Dc ----abc
\s:匹配任意空白字元[ \t\r\n\f\v]
例:a\sb ---a b
\S:非空白字元[^\s]
例:a\Sb ---abc
\w:匹配包括下劃線在內的任意字元[A-Za-z0-9_]
例:a\wc ---abc
\W:匹配非單詞字元[^A-Za-z0-9_]
例:a\Wb ---a b
\A:僅匹配字元串開頭,同^
例:\Aabc ---abc
\Z:僅匹配字元串末尾,同$
例:abc\Z ----abc
\B:匹配\w和\W之間,即匹配單詞邊界匹配一個單詞邊界,也就是指單詞和空格間的位置。
例:’er\b‘ 可以匹配’never‘ 中的’er‘,但不能匹配’verb‘中的’er‘
\B:[^\b]
例:a\Bbc ---abc
正則表達式的常用函數:
match和search一旦匹配成功,就是一個match object對象,而match object對象有以下方法:
group():返回被re匹配的字元串
可以一次輸入多個組號,對應組號匹配的 字元串
start():返回匹配開始的位置
end():返回匹配結束的位置
spend():返回一個元組包含匹配(開始,結束)的位置
1、compile()
編譯正則表達式模式,返回一個對象的模式。(可以把那些常用的正則表達式編譯成正則表達式對象,這樣可以提高一點效率)
re.compile(pattern,flags=0)
pattern:編譯時用的表達式字元串。
flags:編譯標誌位,用於修正正則表達式的匹配方式,如:是否區分大小寫,多行匹配等,常用的flags有:
re.S(DOTALL):使‘.’特殊字元匹配任何字元,包括換行;如果沒有此標誌,‘.’將匹配任何內容除換行符。
re.I(IGNORECASE):使匹配對大小寫不敏感。
re.L(LOCALE):做本地化識別(locale-aware)匹配
re.M(MULTILINE):多行匹配,影響^和$
re.X(VERBOSE):該標誌通過給予更靈活的格式以便將正則表達式寫的更易於理解
re.U:根據Unicode字元集解析字元,這個標識影響\w,\W,\b,\B
2、match()
決定re是否在字元串剛開始的位置匹配。
註:這個方法並不是完全匹配。當pattern結束時若string還有剩餘字元,仍然視為成功。想要完全匹配,可以在表達式末尾加上邊界匹配符‘$’
格式:re.match(pattern,string,flags=0)
例:
print(re.match('com','comwww.runcomoob').group())
print(re.match('com','Comwww.runcomoob',re.I).group())
>>com
>>Com
3、search()
re.search函數會在字元串內查找模式匹配,只要找到第一個匹配然後返回,如果字元串沒有匹配,則返回None
格式:re.search(pattern,string,flags=0)
例:
print(re.search('\dcom','4com5com').group())
>>4com
4,findall()
re.findall遍歷匹配,可以獲取字元串中所有匹配的字元串,返回一個列表。
格式:
re.findall(pattern,string,flags=0)
例1:
p=re.compile(r'\d+')
print(p.findall('h32h3jh2uhr23'))
>>['32', '3', '2', '23']
5、finditer()
搜索string,返回一個順序訪問每一個匹配結果(match)對象的迭代器。找到re匹配的所有字元串,並把它們作為一個迭代器返回。
格式:
re.finditer(pattern,string,flags=0)
例:
iter=re.finditer(r'\d+','12gjh232jkg34')
for i in iter:
print(i)
print(i.group())
print(i.span())
#返回迭代器對象;匹配數值;位置
>><_sre.SRE_Match object; span=(0, 2), match='12'>
12
(0, 2)
>><_sre.SRE_Match object; span=(5, 8), match='232'>
232
(5, 8)
>><_sre.SRE_Match object; span=(11, 13), match='34'>
34
(11, 13)
6、split()
按照能夠匹配的字元串string分割後返回列表。
可以使用re.split來分割字元串,如:re.split(r'\s+',text);將字元串按空格分割成一個列表。
格式:
re.split(pattern,string,maxsplit=0,flags=0)
例:
print(re.split('\d+','ont1two2three3four4five5',3))
>>['ont', 'two', 'three', 'four4five5']
7、sub()
使用re替換string中每個匹配的字元串返回後的值。
格式:
re.sub(pattern,repl,string,count)
例:
text='ont1two2three3four4five5'
print(re.sub(r'\d+',' ',text))
>>ont two three four five
8、subn()
返回替換次數
格式:
subn(pattern,repl,string,count=0,flags=0)
例:
print(re.subn(r'\d',' ','ont1two2three3four4five5'))
>>('ont two three four five ', 5)