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

歡迎訪問 生活随笔!

生活随笔

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

python

28Python正则表达式、正则表达式对象、正则表达式修饰符、表达式模板、表达式实例、match函数、search方法、检索和替换、repl、compile、findall等

發(fā)布時(shí)間:2024/9/27 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 28Python正则表达式、正则表达式对象、正则表达式修饰符、表达式模板、表达式实例、match函数、search方法、检索和替换、repl、compile、findall等 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

28Python正則表達(dá)式

正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配。

Python 自1.5版本起增加了re 模塊,它提供 Perl 風(fēng)格的正則表達(dá)式模式。

re 模塊使 Python 語言擁有全部的正則表達(dá)式功能。

compile 函數(shù)根據(jù)一個(gè)模式字符串和可選的標(biāo)志參數(shù)生成一個(gè)正則表達(dá)式對象。該對象擁有一系列方法用于正則表達(dá)式匹配和替換。

re 模塊也提供了與這些方法功能完全一致的函數(shù),這些函數(shù)使用一個(gè)模式字符串做為它們的第一個(gè)參數(shù)。

本章節(jié)主要介紹Python中常用的正則表達(dá)式處理函數(shù)。

28.1正則表達(dá)式對象

28.1.1re.RegexObject

re.compile() 返回 RegexObject 對象。

28.1.2re.MatchObject

group()返回被RE匹配的字符串
?start()返回匹配結(jié)果的位置。
?end()返回匹配結(jié)束的位置。
?span()返回一個(gè)元組包含匹配(開始,結(jié)束)的位置

28.2正則表達(dá)式修飾符 - 可選標(biāo)識(shí)

正則表達(dá)式可以包含一些可選標(biāo)志修飾符來控制匹配的模式。修飾符被指定為一個(gè)可選的標(biāo)志。多個(gè)標(biāo)志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設(shè)置成 I 和 M 標(biāo)志:

28.3正則表達(dá)式模式

模式字符串使用特殊的語法來表示一個(gè)正則表達(dá)式:
字母和數(shù)字表示他們自身。一個(gè)正則表達(dá)式模式中的字母和數(shù)字匹配同樣的字符串。
多數(shù)字母和數(shù)字前加一個(gè)反斜杠時(shí)會(huì)擁有不同的含義。
標(biāo)點(diǎn)符號只有被轉(zhuǎn)義時(shí)才匹配自身,否則它們表示特殊的含義。
反斜杠本身需要使用反斜杠轉(zhuǎn)義。
由于正則表達(dá)式通常都包含反斜杠,所以你最好使用原始字符串來表示它們。模式元素(如 r’\t’,等價(jià)于 ‘\t’)匹配相應(yīng)的特殊字符。
下表列出了正則表達(dá)式模式語法中的特殊元素。如果你使用模式的同時(shí)提供了可選的標(biāo)志參數(shù),某些模式元素的含義會(huì)改變。


28.4正則表達(dá)式實(shí)例

28.5re.match函數(shù)

re.match嘗試從字符串的起始位置匹配一個(gè)模式,如果不是起始位置匹配成功的話,match()就返回none.

函數(shù)語法:

re.match(pattern, string, flags=0)

函數(shù)參數(shù)說明:

匹配成功re.match方法返回一個(gè)匹配的對象,否則返回None。
我們可以使用group(num)或groups()匹配對象函數(shù)來獲取匹配表達(dá)式。

實(shí)例:

# -*- coding: UTF-8 -*-import re print(re.match('www','www.runoob.com').span()) #在起始位置匹配 print(re.match('com','www.runoob.com')) #不在起始位置匹配

以上實(shí)例運(yùn)行輸出結(jié)果為:

(0, 3) None

實(shí)例:

# -*- coding: UTF-8 -*-import re line = "Cats are smarter than dogs"matchObj = re.match(r'(.*) are (.*?) .*',line,re.M | re.I)if matchObj:print("matchObj.group():",matchObj.group())print("matchObj.group(1):",matchObj.group(1))print("matchObj.group(2):",matchObj.group(2)) else:print("No match!!")

運(yùn)行結(jié)果:

matchObj.group(): Cats are smarter than dogs matchObj.group(1): Cats matchObj.group(2): smarter

28.6re.search()方法

re.search掃描整個(gè)字符串并返回第一個(gè)成功的匹配。
函數(shù)語法:

re.search(pattern, string, flags=0)

函數(shù)參數(shù)說明:

匹配成功re.search方法返回一個(gè)匹配的對象,否則返回None。
我們可以使用group(num) 或 groups() 匹配對象函數(shù)來獲取匹配表達(dá)式。

實(shí)例:

# -*- coding: UTF-8 -*-import re print(re.search('www','www.runoob.com').span()) #在起始位置匹配 print(re.search('com','www.runoob.com').span()) #不在起始位置匹配

以上實(shí)例運(yùn)行輸出結(jié)果為:

(0, 3) (11, 14)

實(shí)例:

# -*- coding: UTF-8 -*-import reline = "Cats are smarter than dogs";searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)if searchObj:print("searchObj.group() : ", searchObj.group())print("searchObj.group(1) : ", searchObj.group(1))print("searchObj.group(2) : ", searchObj.group(2)) else:print("Nothing found!")

運(yùn)行結(jié)果:

searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter

28.7re.match與re.search的區(qū)別

re.match只匹配字符串的開始,如果字符串開始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None;而re.search匹配整個(gè)字符串,直到找到一個(gè)匹配。

# -*- coding: UTF-8 -*-import reline = "Cats are smarter than dogs"matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj:print("match --> matchObj.group():",matchObj.group()) else:print("None match")matchObj = re.search(r'dogs',line,re.M|re.I) if matchObj:print("search --> searchObj.group():",matchObj.group()) else:print("No match!!")

28.8檢索和替換

Python的re模塊提供了re.sub用于替換字符串中的匹配項(xiàng)。
語法:

re.sub(pattern, repl, string, count=0, flags=0)

參數(shù):
?pattern : 正則中的模式字符串。
?repl : 替換的字符串,也可為一個(gè)函數(shù)。
?string : 要被查找替換的原始字符串。
?count : 模式匹配后替換的最大次數(shù),默認(rèn) 0 表示替換所有的匹配。
實(shí)例:

# -*- coding: UTF-8 -*-import rephone = "2004-959-559 # 這是一個(gè)國外電話號碼"#刪除字符串中的Python注釋 num = re.sub(r'#.*$', "", phone) print("電話號碼是:",num)#刪除非數(shù)字(-)的字符串 num = re.sub(r'\D',"",phone) print("電話號碼是:",num)

運(yùn)行結(jié)果:

電話號碼是: 2004-959-559 電話號碼是: 2004959559

28.9repl參數(shù)是一個(gè)函數(shù)

以下實(shí)例中將字符串中的匹配的數(shù)字乘以2:

# -*- coding: UTF-8 -*-import re# 將匹配的數(shù)字乘以 2 def double(matched):value = int(matched.group('value'))return str(value * 2)s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s))

運(yùn)行結(jié)果:

A46G8HFD1134

28.10re.compile 函數(shù)

compile函數(shù)用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式(Pattern)對象,供match()和search()這兩個(gè)函數(shù)使用。
語法格式為:

re.compile(pattern[, flags])

參數(shù):
?pattern:一個(gè)字符串形式的正則表達(dá)式。
?flags:可選,表示匹配模式,比如忽略大小寫,多行模式等,具體參數(shù)為:
re.I忽略大小寫
re.L表示特殊字符集\w,\W,\b,\B,\s,\S依賴于當(dāng)前環(huán)境
re.M多行模式
re.S即為.并且包含換行符在內(nèi)的任意字符(.不包括換行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫。
re.X為了增加可讀性,忽略空格和#后面的注釋
實(shí)例

# -*- coding: UTF-8 -*-import re pattern = re.compile(r'\d+') #用于匹配至少一個(gè)數(shù)字 m = pattern.match('one12twothree34four') #查找頭部,沒有匹配 print(m) #結(jié)果:Nonem = pattern.match('one12twothree34four',2,10) #從'e'的位置開始匹配,沒有匹配 print(m) #結(jié)果:Nonem = pattern.match('one12twothree34four',3,10) #'1'的位置開始匹配,正好匹配 print(m) #結(jié)果:<re.Match object; span=(3, 5), match='12'>print(m.group(0)) #可省略0 #結(jié)果:12print(m.start(0)) #可省略0 #結(jié)果:3print(m.end(0)) #可省略0 #結(jié)果:5print(m.span(0)) #可省略0 #結(jié)果:(3, 5)

在上面,當(dāng)匹配成功時(shí)返回一個(gè)Match對象,其中:
?group([group1, …]) 方法用于獲得一個(gè)或多個(gè)分組匹配的字符串,當(dāng)要獲得整個(gè)匹配的子串時(shí),可直接使用 group() 或 group(0);
?start([group]) 方法用于獲取分組匹配的子串在整個(gè)字符串中的起始位置(子串第一個(gè)字符的索引),參數(shù)默認(rèn)值為 0;
?end([group]) 方法用于獲取分組匹配的子串在整個(gè)字符串中的結(jié)束位置(子串最后一個(gè)字符的索引+1),參數(shù)默認(rèn)值為 0;
?span([group]) 方法返回 (start(group), end(group))。

# -*- coding: UTF-8 -*-import re pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小寫 m = pattern.match('Hello World Wide Web') print(m) # 匹配成功,返回一個(gè) Match 對象 #結(jié)果:<re.Match object; span=(0, 11), match='Hello World'>print(m.group(0)) # 返回匹配成功的整個(gè)子串 #結(jié)果:Hello Worldprint(m.span(0)) # 返回匹配成功的整個(gè)子串的索引 #結(jié)果:(0, 11)print(m.group(1)) # 返回第一個(gè)分組匹配成功的子串 #結(jié)果:Helloprint(m.span(1)) # 返回第一個(gè)分組匹配成功的子串的索引 #結(jié)果:(0, 5)print(m.group(2)) # 返回第二個(gè)分組匹配成功的子串 #結(jié)果:Worldprint(m.span(2)) # 返回第二個(gè)分組匹配成功的子串 #結(jié)果:(6, 11)print(m.groups()) # 等價(jià)于 (m.group(1), m.group(2), ...) #結(jié)果:('Hello', 'World')#m.group(3) # 不存在第三個(gè)分組

28.11findall

在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個(gè)列表,如果沒有找到匹配的,則返回空列表。
注意:match和search是匹配一次findall匹配所有。
語法格式為:

findall(string[, pos[, endpos]])

參數(shù):
?string:待匹配的字符串
?pos:可選參數(shù),指定字符串的起始位置,默認(rèn)為0
?endpos:可選參數(shù),指定字符串的結(jié)束位置,默認(rèn)為字符串的長度。
查找字符串中的所有數(shù)字:

# -*- coding: UTF-8 -*-import repattern = re.compile(r'\d+') #查找數(shù)字 result1 = pattern.findall('runoob 123 google 456') result2 = pattern.findall('run88oob123google456',0,10)print(result1) print(result2)

運(yùn)行結(jié)果:

['123', '456'] ['88', '12']

28.12re.finditer

和 findall 類似,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個(gè)迭代器返回。

實(shí)例

# -*- coding: UTF-8 -*-import reit = re.finditer(r"\d+","12a32bc43jf3") for match in it:print(match.group())

運(yùn)行結(jié)果:

12 32 43 3

28.13re.split

split方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:

re.split(pattern, string[, maxsplit=0, flags=0])

參數(shù):

實(shí)例:

>>> import re >>> re.split('\W+','runoob,runoob,runoob.') ['runoob', 'runoob', 'runoob', ''] >>> re.split('(\W+)',' runoob,runoob,runoob.') ['', ' ', 'runoob', ',', 'runoob', ',', 'runoob', '.', ''] >>> re.split('\W+',' runoob,runoob,runoob.',1) ['', 'runoob,runoob,runoob.'] >>> re.split('a*','hello world') ['', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', ''] >>>

總結(jié)

以上是生活随笔為你收集整理的28Python正则表达式、正则表达式对象、正则表达式修饰符、表达式模板、表达式实例、match函数、search方法、检索和替换、repl、compile、findall等的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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