成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

re模塊與正則表達(dá)式

AlphaGooo / 1432人閱讀

摘要:正則表達(dá)式簡(jiǎn)介正則表達(dá)式英語(yǔ),在代碼中常簡(jiǎn)寫為或,又稱正規(guī)表示式正規(guī)表示法正規(guī)表達(dá)式規(guī)則表達(dá)式常規(guī)表示法,是計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式使用單個(gè)字符串來描述匹配一系列匹配某個(gè)句法規(guī)則的字符串。

正則表達(dá)式 簡(jiǎn)介

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

正則表達(dá)式規(guī)則,單字符匹配
字符 功能 正則表達(dá)式示例 符合匹配示例
. 匹配任意一個(gè)字符(除了n) b.b bab,b2b
[ ] 匹配來自[]中字符集的任意一個(gè)字符 i [abCde]m i am
d 匹配任何十進(jìn)制數(shù)字,與[0-9]一致 wdcschool w3cschool
D 匹配非數(shù)字,即不是數(shù)字 mouDh mouth
s 匹配任何空格字符,與[ vf]相同 islike i like
S 匹配任何非空白字符,與s相反 nSe noe,n3e
w 匹配任何字母數(shù)字字符,與[A-Za-z0-9_]相同 [A-Za-z]w+
W 匹配非單詞字符 [0-9]W[A-Z] 3 A
表示數(shù)量匹配
字符 功能 正則表達(dá)式示例 符合匹配的示例
* 匹配0次或者多次前面出現(xiàn)的正則表達(dá)式,即可有可無 a* aaa
+ 匹配前一個(gè)字符出現(xiàn)1次或者無限次,即至少有一次 a+ aaa
? 匹配前一個(gè)字符出現(xiàn)1次或者0次,要么有一次,要么沒有 a? a或者b
{m} 匹配前一個(gè)字符出現(xiàn)m次 [0-9]{5} 12345
{m.} 匹配前一個(gè)字符至少出現(xiàn)m次 a{5.} aaaaa
{m,n} 匹配前一個(gè)字符出現(xiàn)從m到n次 a{2,6} aaa
表示邊界匹配
字符 功能 正則表達(dá)式示例
^ 匹配字符串起始部分 ^Dear
$ 匹配字符串終止部分 fi$
b 匹配任何單詞的邊界 The
B 匹配非單詞邊界 .*Bver
匹配分組
字符 功能
匹配左右任意一個(gè)表達(dá)式
(ab) 將括號(hào)中字符作為一個(gè)分組
um 引用分組num匹配到的字符串
(?P) 分組起別名
(?P=name) 引用別名為name分組匹配到的字符串
re模塊

在python中,可以使用內(nèi)置的re模塊來使用正則表達(dá)式

re模塊常見的函數(shù)和方法
核心函數(shù) 說明
compile(pattern,flags=0) 使用任何可選的標(biāo)記來編譯正則表達(dá)式的模式,然后返回一個(gè)正則表達(dá)式對(duì)象
re模塊函數(shù)和正則表達(dá)式對(duì)象方法 說明
match(pattern,string,flags=0) 嘗試使用帶有可選的標(biāo)記的正則表達(dá)式的模式來匹配字符串。如果匹配成功,就返回匹配對(duì)象; 如果失敗,就返回 None
search(pattern,string,flags=0) 使用可選標(biāo)記搜索字符串中第一次出現(xiàn)的正則表達(dá)式模式。 如果匹配成功,則返回匹配對(duì)象; 如果失敗,則返回 None
findall(pattern,string[,flags]) 查找字符串中所有出現(xiàn)的正則表達(dá)式,并返回一個(gè)列表
finditer(pattern,string[,flags]) 與findall相同,但返回的是一個(gè)迭代器而不是一個(gè)列表(不常用)
split(pattern,string,max=0) 根據(jù)正則表達(dá)式的模式分隔符,spilt函數(shù)將字符串分割為列表,然后返回成功匹配的列表,分割最多操作max次(默認(rèn)分割所有匹配成功的位置)
sub(pattern,repl,string,count=0) 使用repl替換所有正則表達(dá)式的模式在字符串中出現(xiàn)的位置,除非定義count,否則就將替換所有出現(xiàn)的位置
常用的匹配對(duì)象方法 說明
group(num=0) 默認(rèn)返回整個(gè)匹配對(duì)象或者返回編號(hào)為num的特定子組
groups(default=None) 返回一個(gè)包含所有匹配子組的元組,如果沒有成功匹配,返回一個(gè)空元組
span()
常用的模塊屬性,大多數(shù)用于對(duì)正則表達(dá)式函數(shù)的修飾 說明
re.I 使匹配對(duì)大小寫不敏感(忽略大小寫)
re.S .(點(diǎn)號(hào))匹配除了n之外的所有字符,re.S標(biāo)記表示.(點(diǎn)號(hào))能夠匹配全部字符
re.M 多行匹配,影響^和$
re.U 根據(jù)Unicode字符集解析字符。影響w,W,和B
re.X 該標(biāo)志通過給予你更靈活的格式以便你講正則表達(dá)式寫得更易于理解
re模塊一般的使用方法

使用 compile() 函數(shù)將正則表達(dá)式的字符串形式編譯為一個(gè)正則表達(dá)式對(duì)象;

通過正則表達(dá)式對(duì)象提供的一系列方法(如:match())對(duì)文本進(jìn)行匹配查找,獲得匹配結(jié)果,一個(gè)Match對(duì)象;

最后使用Match對(duì)象提供的屬性和方法(例如:group())獲得信息,根據(jù)需要進(jìn)行其他的操作。

re模塊使用示例

導(dǎo)入模塊

import re

compile()函數(shù)
compile 函數(shù)用于編譯正則表達(dá)式,生成一個(gè) Pattern 對(duì)象,它的一般使用形式如下:

import re

# 將正則表達(dá)式編譯成pattern對(duì)象
pattern = re.compile(r"d+")

編譯成正則表達(dá)式對(duì)象后,就可以使用上面所說的正則表達(dá)式對(duì)象方法了。

match()方法
match 方法用于查找字符串的頭部(也可以指定起始位置),它是一次匹配,只要找到了一個(gè)匹配的結(jié)果就返回,而不是查找所有匹配的結(jié)果。它的一般使用形式如下:

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

其中,string是待匹配的字符串,pos 和 endpos 是可選參數(shù),指定字符串的起始終點(diǎn)位置,默認(rèn)值分別是 0 和 len (字符串長(zhǎng)度)。因此,當(dāng)你不指定 pos 和 endpos 時(shí),match 方法默認(rèn)匹配字符串的頭部。

當(dāng)匹配成功時(shí),返回一個(gè) Match 對(duì)象,如果沒有匹配上,則返回 None。

>>> import re
>>> 
>>> pattern = re.compile(r"d+") # 正則表達(dá)式表示匹配至少一個(gè)數(shù)字
>>> 
>>> m = pattern.match("one2three4") # match默認(rèn)從開頭開始匹配,開頭是字母o,所以沒有匹配成功
>>> print(m) # 匹配失敗返回None
None
>>> 
>>> m = pattern.match("1two3four") # 開頭字符是數(shù)字,匹配成功
>>> print(m)
<_sre.SRE_Match object; span=(0, 1), match="1">
>>> 
>>> m.group() # group()方法獲取匹配成功的字符
"1"
>>> m = pattern.match("onetwo3four56",6,12) # 指定match從數(shù)字3開始查找,第一個(gè)是數(shù)字3,匹配成功
>>> print(m)
<_sre.SRE_Match object; span=(6, 7), match="3">
>>> m.group()
"3"

search()方法
search 方法用于查找字符串的任何位置,從任何位置開始往后查找,它也是一次匹配,只要找到了一個(gè)匹配的結(jié)果就返回,而不是查找所有匹配的結(jié)果,它的一般使用形式如下:

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

其中,string 是待匹配的字符串,pos 和 endpos 是可選參數(shù),指定字符串的起始和終點(diǎn)位置,默認(rèn)值分別是 0 和 len (字符串長(zhǎng)度)。

當(dāng)匹配成功時(shí),返回一個(gè) Match 對(duì)象,如果沒有匹配上,則返回 None。

In [1]: import re

In [2]: pattern = re.compile(r"[A-Za-z]+") # 表示匹配至少一個(gè)字母

In [3]: ret = pattern.search("123four5") # 這里如果使用match則不匹配,因?yàn)橐詳?shù)字開頭

In [4]: print(ret)
<_sre.SRE_Match object; span=(3, 7), match="four">

In [5]: ret.group()
Out[5]: "four"

In [9]: ret = pattern.search("123four5six789",7,12)

In [10]: print(ret)
<_sre.SRE_Match object; span=(8, 11), match="six">

In [11]: ret.group()
Out[11]: "six"

In [12]: ret = pattern.search("123four5six789",1,2)

In [13]: print(ret) # 不匹配,返回None
None

findall()方法
match方法和search方法都是匹配到正則表達(dá)式的第一個(gè)內(nèi)容,如果想要獲取正則表達(dá)式匹配的所有內(nèi)容,就可以使用findall方法了。這個(gè)方法會(huì)搜索整個(gè)字符串,然后返回匹配正則表達(dá)式的所有內(nèi)容。

findall 方法的使用形式如下:

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

其中,string 是待匹配的字符串,pos 和 endpos 是可選參數(shù),指定字符串的起始和終點(diǎn)位置,默認(rèn)值分別是 0 和 len (字符串長(zhǎng)度)。

findall 以列表形式返回全部能匹配的子串,如果沒有匹配,則返回一個(gè)空列表。
示例:

import re

pattern = re.compile(r"d+")

ret1 = pattern.findall("hello 123 world 456")# 匹配123,456
ret2 = pattern.findall("one1two2three3") # 匹配1,2,3
ret3 = pattern.findall("hello world") # 沒有數(shù)字不匹配,返回空列表

print(ret1)
print(ret2)
print(ret3)

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

["123", "456"]
["1", "2", "3"]
[]

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

split(string[, maxsplit])

其中,maxsplit 用于指定最大分割次數(shù),不指定將全部分割。
示例:

>>> import re
>>> 
>>> pattern = re.compile(r"[s;,]+")
>>> ret = pattern.split("hello  world;;ha,ha")
>>> print(ret)
["hello", "world", "ha", "ha"]

sub()方法
sub 方法用于替換,在python爬蟲中常用語(yǔ)修改文本。比如把一串文本中所有數(shù)字去掉,把數(shù)字去掉可以使用字符串方法中的replace方法,但是太麻煩了,使用sub()方法就可以很方便去掉。sub()方法的使用形式如下:

sub(repl, string[, count])

其中,repl 可以是字符串也可以是一個(gè)函數(shù):

如果 repl 是字符串,則會(huì)使用 repl 去替換字符串每一個(gè)匹配的子串,并返回替換后的字符串,另外,repl 還可以使用 id 的形式來引用分組,但不能使用編號(hào) 0;

如果 repl 是函數(shù),這個(gè)方法應(yīng)當(dāng)只接受一個(gè)參數(shù)(Match 對(duì)象),并返回一個(gè)字符串用于替換(返回的字符串中不能再引用分組)。

count 用于指定最多替換次數(shù),不指定時(shí)全部替換。

示例:

import re

content = "42hjad24ta d25a14aad"
content = re.sub("d+","",content)
print(content)

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

hjadta daaad
正則表達(dá)式規(guī)則常見使用 貪婪匹配和非貪婪匹配

貪婪模式:在整個(gè)表達(dá)式匹配成功的前提下,盡可能多的匹配 ( * );

非貪婪模式:在整個(gè)表達(dá)式匹配成功的前提下,盡可能少的匹配 ( ? );

Python中默認(rèn)是貪婪模式

示例
源字符串:abccc

貪婪模式匹配:abc*

非貪婪模式匹配:abc*?

abc*,匹配盡可能多個(gè)c
abc*?,匹配盡可能少個(gè)c,最少為0即沒有,所以打印ab

>>> import re
>>> 
>>> ret = re.match("abc*","abccc")
>>> print(ret)
<_sre.SRE_Match object; span=(0, 5), match="abccc">
>>> 
>>> ret.group()
"abccc"
>>> 
>>> ret = re.match("abc*?","abccc")
>>> ret.group()
"ab"
分組

圓括號(hào)()匹配封閉的正則表達(dá)式,然后另存為子組。

>>> m = re.match("(www)@(ffffd).(www)","[email protected]")
>>> m.group()
"[email protected]"
>>> m.group(1)
"xxx"
>>> m.group(2)
"163"
>>> m.group(3)
"com"
>>> m.groups()
("xxx", "163", "com")

group()通常用于以普通方式顯示所有的匹配部分,但也可以用于獲取各個(gè)匹配的子組。而groups()方法可以獲取一個(gè)包含所有匹配子字符串的元組。

轉(zhuǎn)義匹配

當(dāng)匹配目標(biāo)中有正則表達(dá)式的特殊字符,就需要使用轉(zhuǎn)義字符""將特殊字符的作用屏蔽掉。

>>> content = "(hello,world)"
>>> m = re.match("(.*)",content)
>>> print(m)
<_sre.SRE_Match object; span=(0, 13), match="(hello,world)">
>>> m.group()
"(hello,world)"

通用匹配

.(點(diǎn)號(hào))表示匹配任意一個(gè)字符,*(星號(hào))表示匹配前面的字符無限次,組合起來.*就是匹配任意字符。

>>> content = "hello 123456789 world hahaha"
>>> m = re.match("^hello.*ha$",content)
>>> print(m)
<_sre.SRE_Match object; span=(0, 28), match="hello 123456789 world hahaha">
>>> m.group()
"hello 123456789 world hahaha"


匹配多個(gè)字符串

豎線"|"表示匹配豎線左邊的表達(dá)式或者右邊的表達(dá)式,如re1|re2,滿足其中一個(gè)表達(dá)式就匹配成功

>>> m = re.match("abc|adc|aec","adc")
>>> m.group()
"adc"
>>> m = re.match("abc|adc|aec","aoc")
>>> print(m)
None
>>> m = re.findall("abc|adc|aec","abc aec aoc")
>>> print(m)
["abc", "aec"]


[]字符集使用

方括號(hào)[]表示匹配來自字符集中任意一個(gè)字符。

>>> m = re.match("[abc][123][A-Z]","b2A")
>>> m.group()
"b2A"
>>> m = re.match("[abc][123][A-Z]","a3A")
>>> m.group()
"a3A"
>>> m = re.match("[abc][123][A-Z]","d2B") # 不匹配
>>> print(m)
None
>>> 




文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43229.html

相關(guān)文章

  • Python基礎(chǔ)教程:-正則達(dá)式基本語(yǔ)法以及re模塊

    摘要:正則表達(dá)式關(guān)閉或可選標(biāo)志。如果所含正則表達(dá)式,以表示,在當(dāng)前位置成功匹配時(shí)成功,否則失敗。否則指的是八進(jìn)制字符碼的表達(dá)式。 正則表達(dá)式是個(gè)很牛逼的東西,不管是在javascript,還是在Python web開發(fā)(http://www.maiziedu.com/course/python-px...)中,我們都會(huì)遇到正則表達(dá)式,雖然javascript和Python的正則表達(dá)式區(qū)別不大...

    y1chuan 評(píng)論0 收藏0
  • python模塊re正則達(dá)式

    摘要:多行模式,改變?cè)址偷男袨?。模塊級(jí)方法編譯正則表達(dá)式,返回一個(gè)對(duì)象。掃描參數(shù),查找正則表達(dá)式產(chǎn)生匹配的第一個(gè)結(jié)果,返回一個(gè)對(duì)象。清空正則表達(dá)式緩存。和參數(shù)意義同與模塊級(jí)的相同與模塊級(jí)的相同屬性返回一個(gè)正整數(shù),表示正則匹配模式。 匹配模式 re.ASCII同re.A,對(duì)應(yīng)的內(nèi)聯(lián)標(biāo)識(shí)為(?a),用于向后兼容。使元字符w, W, , B, d, D, s和S僅匹配ASCII字符。該模式只...

    Cheriselalala 評(píng)論0 收藏0
  • Python正則達(dá)式很難?一篇文章搞定他,不是我吹!

    摘要:正則表達(dá)式語(yǔ)法字符與字符類特殊字符以上特殊字符要想使用字面值,必須使用進(jìn)行轉(zhuǎn)義字符類包含在中的一個(gè)或者多個(gè)字符被稱為字符類,字符類在匹配時(shí)如果沒有指定量詞則只會(huì)匹配其中的一個(gè)。 1. 正則表達(dá)式語(yǔ)法 1.1 字符與字符類 1 特殊字符:.^$?+*{}| 以上特殊字符要想使用字面值,必須使用進(jìn)行轉(zhuǎn)義 2 字符類 1. 包含在[]中的一個(gè)或者多個(gè)字符被稱為字符類,字符類在匹配時(shí)如果沒有指...

    dcr309duan 評(píng)論0 收藏0
  • Python中的正則達(dá)式

    摘要:正則表達(dá)式匹配的字符串限定范圍和否定除了單字符外,字符集還支持匹配指定的字符范圍。問號(hào)要求正則表達(dá)式引擎在當(dāng)前正則表達(dá)式中盡可能少地匹配字符。正則表達(dá)式匹配的字符串表示簡(jiǎn)單浮點(diǎn)數(shù)的字符串?dāng)U展表示法正則表達(dá)式的擴(kuò)展表示法,以問號(hào)開始。 簡(jiǎn)介 正則表達(dá)式 是包含文本和特殊字符的字符串, 為高級(jí)的文本模式匹配, 抽取, 與文本形式的搜索和替換功能提供了基礎(chǔ) Python通過標(biāo)準(zhǔn)庫(kù)re模...

    Lowky 評(píng)論0 收藏0
  • 【Python】Python正則達(dá)式使用指導(dǎo)

    摘要:反斜杠的困擾與大多數(shù)編程語(yǔ)言相同,正則表達(dá)式里使用作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。文本中正則表達(dá)式結(jié)束搜索的索引。以元組形式返回全部分組截獲的字符串。用于指定最大分割次數(shù),不指定將全部分割。 1. 正則表達(dá)式基礎(chǔ) 1.1. 簡(jiǎn)單介紹 正則表達(dá)式并不是Python的一部分。正則表達(dá)式是用于處理字符串的強(qiáng)大工具,擁有自己獨(dú)特的語(yǔ)法以及一個(gè)獨(dú)立的處理引擎,效率上可能不如str自帶的方法...

    nihao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<