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

歡迎訪問 生活随笔!

生活随笔

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

python

python核心编程第三版(一)学习笔记:正则表达式

發(fā)布時(shí)間:2023/12/20 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python核心编程第三版(一)学习笔记:正则表达式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

注:下面有些內(nèi)容不全都來(lái)源于原著,這些都是通過各方面的資料收集合并的結(jié)果。

目錄

一、正則表達(dá)式介紹

二、分類解析

1、元字符

匹配對(duì)象以及group()和groups()方法

搜索與匹配的比較

2、數(shù)量詞:會(huì)出現(xiàn)貪婪模式

3、邊界詞

4、分組詞

5、特殊構(gòu)造

三、re模塊下的函數(shù)

1、compile:

2、search:

3、match:

4、split:

5、findall:

6、sub:

7、escape:

四、re模塊下函數(shù)的方法


一、正則表達(dá)式介紹

正則表達(dá)式為高級(jí)的文本模式匹配、抽取、與/或文本形式的搜索和替換功能提供了基礎(chǔ)。

這里主要講針對(duì)于python編程中的正則表達(dá)式內(nèi)容,也就是講解re模塊的應(yīng)用,因?yàn)閜ython是通過標(biāo)準(zhǔn)庫(kù)中的re模塊來(lái)支持正則表達(dá)式的。

常見正則表達(dá)式符號(hào)和特殊字符(后面會(huì)針對(duì)這些做一些練習(xí)題)

符號(hào)

描述

示例

Literal

匹配文本字符串的字面值literal

Foo

re1| re2

匹配正則表達(dá)式re1或者re2

foo|bal

.(點(diǎn))

匹配任何字符(除了\n之外)

b.b

^

匹配字符串的起始部分

^Dear

$

匹配字符串的終止部分

/bin/*sh$

*

匹配0次或多次前面出現(xiàn)的正則表達(dá)式

[A-Za-z0-9]*

+

匹配1次或多次前面出現(xiàn)的正則表達(dá)式

[a-z]+\.com

?

匹配0次或1次前面出現(xiàn)的正則表達(dá)式

goo?

{N}

匹配N次前面出現(xiàn)的正則表達(dá)式

[0-9]{3}

{M,N}

匹配M~N次前面出現(xiàn)的正則表達(dá)式

[0-9]{3,5}

[...]

匹配來(lái)自字符集的任意單一字符

[aeiou]

[..x-y..]

匹配x~y范圍中的任意單一字符

[0-9],[a-z]

[^...]

不匹配此字符集中出現(xiàn)的任何一個(gè)字符,包括某一范圍內(nèi)的字符(不包括此字符集中出現(xiàn))

[^aeiou]

(*|+|?|{})?

用于匹配上面頻繁出現(xiàn)/重復(fù)出現(xiàn)符號(hào)的非貪婪版本(*、+、?、{})

.*?[a-z]

(...)

匹配封閉的正則表達(dá)式然后另存為子組

([0-9]{3})?,f(oo|u)bar

特殊字符

?

?

\d

匹配任何十進(jìn)制數(shù)字,與[0-9]一致(\D與\d相反,不匹配任何非數(shù)值型的數(shù)字)

data\d+.txt

\w

匹配任何字母數(shù)字字符,與[A-Za-z0-9]相同(\W與之相反)

[A-Za-z]\w+

\s

匹配任何空格字符,與[\n\t\r\v\f]相同(\S與之相反)

of\sthe

\b

匹配任何單詞邊界(\B與之相反)

\bThe\b

\N

匹配已保存的子組N(參見上面的(...))

price:\14

\c

逐字匹配任何特殊字符c(即,僅按字面意思匹配,不匹配特殊含義)

\.,\\,\*

\A(\Z)

匹配字符串的起始(結(jié)束)(另見上面的^和$)

\ADear

擴(kuò)展表示法

?

?

(?iLmsux)

在正則表達(dá)式中嵌入一個(gè)或者多個(gè)特殊“標(biāo)記“參數(shù)(或者通過函數(shù)/方法)

(?x),(? Im)

(?...)

表示一個(gè)匹配不用保存的分組

(?:\w+\.)*

(?p<name>...)

像一個(gè)僅由name標(biāo)識(shí)而不是數(shù)字ID標(biāo)識(shí)的正則分組匹配

(?p<data>)

(?P=name)

在同一字符串中匹配由(?p<name)分組的之前文本

(?p=data)

(?#...)

表示注釋,所有內(nèi)容都被忽略

(?#comment)

(?=...)

匹配條件是如果...出現(xiàn)在之后的位置,而不適用輸入字符串;稱作正向前視斷言

(?=.com)

(?!...)

匹配條件是如果...不出現(xiàn)之后的位置,而不使用輸入字符串;稱作負(fù)向前視斷言

(?!.net)

(?<=...)

匹配條件是如果...出現(xiàn)在之前的位置;而不使用輸入字符串;稱作正向后視斷言

(?<=800-)

(?<!...)

匹配條件是如果...不出現(xiàn)在之前的位置,而不使用輸入字符串;稱作負(fù)向后視斷言

(?<!192\.168\.)

(?(id/name)Y|N)

如果分組所提供的id或name存在,就返回正則表達(dá)式的條件匹配Y,如果不存在就返回N;|N是可選項(xiàng)

(?(1)y|x)

二、分類解析

1、元字符

字符

???????? 描述

.

除換行符外的任意字符

\ 

轉(zhuǎn)義字符

[...]

字符集合

\d 

數(shù)字:[0-9]

\D 

非數(shù)字[^0-9]

\s

空白字符[\t\r\n\f、空格]

\S

非空白字符[^\s]

\w

單詞字符[A-Za-z0-9]

\W

非單詞字符[^\w]

# "."通配符 >>> import re >>> pat = re.compile(".") >>> pat.match('abc') <_sre.SRE_Match object; span=(0, 1), match='a'> >>> pat.match("abc").group() 'a' #匹配到了首個(gè)字符 >>> pat.match("abc").groups() () >>> pat.search("abc").group() 'a' >>> pat.search("abc").groups() () >>> pat.match("\n").group() Traceback (most recent call last): #換行符匹配出錯(cuò)File "<pyshell#8>", line 1, in <module>pat.match("\n").group() AttributeError: 'NoneType' object has no attribute 'group' >>>

匹配對(duì)象以及group()和groups()方法

當(dāng)處理正則表達(dá)式時(shí)。除了正則表達(dá)式對(duì)象之外,還有另一個(gè)對(duì)象類型:匹配對(duì)象(成功調(diào)用match或search返回的對(duì)象)。匹配對(duì)象有兩個(gè)重要的方法:group()和groups()。

group()要么返回整個(gè)匹配對(duì)象,要么根據(jù)要求返回特定子組。

groups()則僅返回一個(gè)包含唯一或者全部子組的元組。

如果沒有子組的要求,group()仍然返回整個(gè)匹配對(duì)象,groups()返回一個(gè)空元組。

不明白的轉(zhuǎn): group 與 groups的區(qū)別

# "\"轉(zhuǎn)義符 >>> import re >>> pat = re.compile("\.") >>> pat.search("ac.efg").group() '.' #匹配到. >>> pat.findall("ac.efg") ['.'] #不用group,返回列表 >>>

關(guān)于re模塊在創(chuàng)建模式對(duì)象(compile)后的常用函數(shù)會(huì)在后面詳細(xì)講解

# "[...]" : 集合,匹配里面的任意一個(gè)元素 >>> import re >>> pat = re.compile("[abc]") >>> pat.match("axbycz").group() 'a' >>> pat.search("axbycz").group() 'a' >>> pat.findall("axbycz") ['a', 'b', 'c'] >>> # "\d" : 數(shù)字 >>> import re >>> pat = re.compile("\d") >>> pat.search("ax1by2cz3").group() '1' #搜索到第一個(gè)數(shù)字:1,返回 >>> pat.match("ax1by2cz3").group() Traceback (most recent call last): #匹配不到(首個(gè)不是數(shù)字)返回None,報(bào)錯(cuò),match匹配字符串頭File "<pyshell#4>", line 1, in <module>pat.match("ax1by2cz3").group() AttributeError: 'NoneType' object has no attribute 'group' >>> >>> pat.findall("ax1by2cz3") #匹配所有的數(shù)字,列表返回 ['1', '2', '3']

搜索與匹配的比較

python主要有兩種方法完成模式匹配:搜索、匹配

搜索,search()實(shí)現(xiàn)在字符串任意部分中搜索匹配的模式

匹配,match()實(shí)現(xiàn)判斷一個(gè)字符串能否從起始處全部或者部分地匹配某個(gè)模式

# "\D" : 非數(shù)字 >>> import re >>> pat = re.compile("\D") >>> pat.match("ax1by2cz3").group() 'a' >>> pat.search("ax1by2cz3").group() 'a' >>> pat.findall("ax1by2cz3") ['a', 'x', 'b', 'y', 'c', 'z'] # "\s" :空白字符有4,包括: \t、\r、\n、空格 >>> import re >>> pat = re.compile("\s") >>> pat.findall("\rax1 \nby2 \tcz3") ['\r', ' ', '\n', ' ', '\t'] >>> pat.search("\rax1 \nby2 \tcz3").group() '\r' >>> pat.match("\rax1 \nby2 \tcz3").group() '\r' # "\S" :非空白字符 >>> import re >>> pat = re.compile("\S") >>> pat.search("\rax1 \nby2 \tcz3").group() 'a' >>> pat.findall("\rax1 \nby2 \tcz3") ['a', 'x', '1', 'b', 'y', '2', 'c', 'z', '3'] # "\w" :單詞字符,數(shù)字和字母:[A-Za-z0-9] >>> import re >>> pat = re.compile("\w") >>> pat.findall("1a2b3c") ['1', 'a', '2', 'b', '3', 'c'] >>> pat.search("1a2b3c").group() '1' >>> pat.match("1a2b3c").group() '1' # "\W":非單詞字符,除數(shù)字和字母外 >>> import re >>> pat = re.compile("\W") >>> pat.findall("1a2我b3c") [] >>> pat.findall("1a2我b3c,4essa.") [',', '.'] >>> pat.search("1a2我b3c,4essa.").group() ','

2、數(shù)量詞:會(huì)出現(xiàn)貪婪模式

數(shù)量詞

????????????? 描述

*

匹配前一個(gè)字符0次或則多次

+

匹配前一個(gè)字符1次或則多次

匹配前一個(gè)字符0次或則1

{m}

匹配前一個(gè)字符m

{m,n}

匹配前一個(gè)字符m次到n

數(shù)量詞?

非貪婪模式

# "*" :0次或則多次 >>> import re >>> pat = re.compile("[abc]*") >>> pat.match("abcabcdefabc").group() 'abcabc' #2次 >>> pat.search("abcabcdefabc").group() 'abcabc' #2次 >>> pat.findall("abcabcdefabc") ['abcabc', '', '', '', 'abc', ''] #2次和1次,因?yàn)橛?次,所以匹配了'' # "+" :1次或則多次 >>> import re >>> pat = re.compile("[abc]+") >>> pat.match("abcdefabcabc").group() 'abc' >>> pat.search("abcdefabcabc").group() 'abc' >>> pat.findall("abcdefabcabc") ['abc', 'abcabc'] # "?" :0次或則1次,match,search 不會(huì)出現(xiàn)none,會(huì)出現(xiàn)'' >>> import re >>> pat = re.compile("[abc]?") >>> pat.match("defabc").group() '' #0次 >>> pat.match('abcdefabc').group() 'a' >>> pat.search('defabc').group() '' #0次 >>> pat.findall('defabc') ['', '', '', 'a', 'b', 'c', ''] #0次和1次 # "{m}" :匹配字符串出現(xiàn)m次 >>> import re >>> pat = re.compile("[op]{2}") #o或則p出現(xiàn)2次 >>> pat.search("abcooapp").group() 'oo' #匹配第一次出現(xiàn)的字符串,o比p先出現(xiàn) >>> pat.findall("abcooapp") ['oo', 'pp'] #匹配出現(xiàn)的所有字符串,列表形式返回 # "{m,n}" :匹配字符串出現(xiàn)m到n次 >>> import re >>> pat = re.compile("[op]{2,4}") #o或則p出現(xiàn)2到4次 >>> pat.match("pppabcooapp").group() 'ppp' #匹配開頭 >>> pat.match("ppabcooapp").group() 'pp' #不連續(xù),非貪婪模式只匹配2次 >>> pat.search("pppabcooapp").group() 'ppp' #匹配第一次出現(xiàn) >>> pat.findall("pppabcooapp") ['ppp', 'oo', 'pp'] #匹配所有 # "數(shù)量詞?" :非貪婪模式:只匹配最少的(盡可能少);默認(rèn)貪婪模式:匹配最多的(盡可能多) >>> import re >>> pat = re.compile("[abc]+") #貪婪模式 >>> pat.match("abcdefabcabc").group() #匹配盡可能多的:abc 'abc' >>> pat.match("bbabcdefabcabc").group() 'bbabc' >>> pat.search("dbbabcdefabcabc").group() 'bbabc' >>> pat.findall("abcdefabcabc") ['abc', 'abcabc'] >>> >>> pat = re.compile("[abc]+?") #非貪婪模式:+? >>> pat.match("abcdefabcabc").group() #匹配盡可能少的:a、b、c 'a' >>> pat.search('dbbabcdefabcabc').group() 'b' >>> pat.findall('abcdefabcabc') ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']

3、邊界詞

邊界詞

????????? 描述?????

^

匹配字符串開頭和行首

$

匹配字符串結(jié)尾和行尾

\A

匹配字符串開頭

\Z

匹配字符串結(jié)尾

\b

匹配\w \W 之間

# "^" :匹配字符串開頭或則行頭 >>> import re >>> pat = re.compile("^[abc]") #開頭是abc >>> pat.search('defabc').group() Traceback (most recent call last): #找不到File "<pyshell#2>", line 1, in <module>pat.search('defabc').group() AttributeError: 'NoneType' object has no attribute 'group' >>> pat.match('defabc').group() Traceback (most recent call last): #找不到File "<pyshell#3>", line 1, in <module>pat.match('defabc').group() AttributeError: 'NoneType' object has no attribute 'group' >>> pat.findall('defabc') [] >>> pat.search('adefabc').group() 'a' #開頭是a、b、c中的任意一個(gè) >>> pat.match('adefabc').group() 'a' >>> pat.findall('adefabc') ['a'] >>> import re >>> pat = re.compile("^[abc]+") #開頭是a、b、c中的任意一個(gè)的一次或則多次,貪婪:匹配多個(gè) >>> pat.findall("cbadefab") ['cba'] >>> pat = re.compile(r'^[abc]+?') #開頭是a、b、c中的任意一個(gè)的一次或則多次,非貪婪:匹配一個(gè) >>> pat.findall('cbadefab') ['c']

compile中的r表示其后的字符串按原樣表示,不使用轉(zhuǎn)義字符,如:
"\n" 表示換行符
r"\n" 表示一個(gè)斜杠加上字符n組成的字符串

# "$" :匹配字符串結(jié)尾或則行尾 >>> import re >>> pat = re.compile("[abc]$") >>> pat.match("adefAbc").group() Traceback (most recent call last): #match匹配的是字符串開頭,所以查找$的時(shí)總是返回NoneFile "<pyshell#2>", line 1, in <module>pat.match("adefAbc").group() AttributeError: 'NoneType' object has no attribute 'group' >>> pat.search('adefAbc').group() 'c' >>> pat.findall('adefAbc') ['c'] >>> >>> pat = re.compile('[abc]+$') >>> pat.search('adefAbc').group() #結(jié)尾是a、b、c中的任意一個(gè)的一次或則多次,貪婪:匹配多個(gè) 'bc' >>> pat.findall('adefAbc') ['bc'] >>> # "\A":匹配字符串開頭 >>> import re >>> pat = re.compile("\A[abc]+") >>> pat.findall('cbadefab') ['cba'] >>> pat.search('cbadefab').group() 'cba' >>> # "\Z":匹配字符串結(jié)尾 >>> import re >>> pat = re.compile('[abc]+\Z') >>> pat.search('cbadefab').group() 'ab' >>> pat.findall('cbadefab') ['ab'] >>> #"\b":匹配\w 和 \W 之間 >>> import re >>> s = "==123!! abc123. 123. 123abc. 123" >>> re.split(r"123\b",s) #123前后都有邊界 ['==', '!! abc', '. ', '. 123abc. ', '']

\b此處不明白請(qǐng)轉(zhuǎn):正則表達(dá)式里\b和\B,Python實(shí)例

4、分組詞

分組方法

描述

|

左右表達(dá)式任意匹配一個(gè),先匹配左邊一旦成功則跳過匹配右邊,
如果|沒有包含在(),匹配整個(gè)正則表達(dá)式

? (...)

分組匹配,從左到右,每遇到一個(gè) ( 編號(hào)+1,分組后面可加數(shù)量詞

(?P<name>...)

除了分組序號(hào)外,指定一個(gè) name的別名

\<number>

引用編號(hào)為<number>的分組匹配到的字符串

(?P=name)

引用別名為<name>的分組匹配到的串

# "(...)" :在模式里面用()來(lái)表示分組(匿名分組),適用于提取目標(biāo)字符串中的某一些部位。 >>> import re >>> pat = re.compile(r"(a)\w(c)") #\w:單詞字符[A-Za-z0-9] >>> pat.match("abdddcccef").group() Traceback (most recent call last): #一個(gè)\w只能匹配一次File "<pyshell#2>", line 1, in <module>pat.match("abdddcccef").group() AttributeError: 'NoneType' object has no attribute 'group' >>> pat.match("adcccef").group() 'adc' >>> pat = re.compile("(a)b(c)") #分2組,匿名分組 >>> pat.match("abcdef").group() 'abc' #默認(rèn)返回匹配的字符串 >>> pat.match("adcdef").group() Traceback (most recent call last): #不匹配File "<pyshell#6>", line 1, in <module>pat.match("adcdef").group() AttributeError: 'NoneType' object has no attribute 'group' >>> pat.match('abcdef').group(1) #取分組1,適用于search 'a' >>> pat.match('abcdef').group(2) #取分組2,適用于search 'c' >>> pat.match('abcdef').groups() #取所有分組,元組形式返回 ('a', 'c') >>> pat=re.compile(r'www\.(.*)\..{3}') >>> pat.match('www.dxy.com').group(1) 'dxy' >>> pat.match('www.dxy.com').groups() ('dxy',) # "(?P<name>...)" 在模式里面用()來(lái)表示分組(命名分組),適用于提取目標(biāo)字符串中的某一些部位。 >>> import re >>> pat = re.compile(r"(?P<K>a)\w(c)") #分2組:命名分組+匿名分組 >>> pat.search('abcdef').groups() #取所有分組,元組形式返回 ('a', 'c') >>> pat.search('abcdef').group(1) #取分組1,適用于search 'a' >>> pat.search('abcdef').group(2) #取分組2,適用于search 'c' >>> pat.search('abcdef').group() #默認(rèn)返回匹配的字符串 'abc' >>> pat.search('abcdef').groupdict() #命名分組可以返回一個(gè)字典【專有】,匿名分組則沒有 {'K': 'a'} >>> pat.search('abcdef').groupdict(2) {'K': 'a'} >>> pat.search('abcdef').groupdict(1) {'K': 'a'} # "(?P=name)" :引用命名分組(別名)匹配: >>> import re >>> pat=re.compile(r'(?P<K>a)\w(c)(?P=K)') #(?P=K)引用分組1的值,就是a >>> pat.search('abcdef').group() Traceback (most recent call last): #匹配不到,因?yàn)橥暾?#39;a\wca',模式的第4位是aFile "<pyshell#3>", line 1, in <module>pat.search('abcdef').group() AttributeError: 'NoneType' object has no attribute 'group' >>> pat.search('abcadef').group() #匹配到,模式的第4位和組1一樣,值是a 'abca' >>> pat.search('abcadef').groups() ('a', 'c') >>> pat.search('abcadef').group(1) 'a' >>> pat.search('abcadef').group(2) 'c' # "\<number>" :引用分組編號(hào)匹配 >>> import re >>> pat=re.compile(r'(?P<K>a)\w(c)(?P=K)\2') #\2引用分組2的值,就是c >>> pat.findall('Aabcadef') #匹配不到,因?yàn)橥暾?#39;a\wcac',模式的第5位是c [] >>> pat.findall('Aabcacdef') #匹配到,模式的第5位和組2一樣,值是c [('a', 'c')] >>> pat.search('Aabcacdef').groups() ('a', 'c') >>> pat.search('Aabcacdef').group() 'abcac' >>> pat.search('Aabcacdef').group(1) 'a' >>> pat.search('Aabcacdef').group(2) 'c'

5、特殊構(gòu)造

方法

描述

(?:...)

(...)不分組版本,用于使用 | 或者后接數(shù)量詞

(?iLmsux)

iLmsux的每個(gè)字符代表一個(gè)匹配模式,只能用在正則表達(dá)式的開頭,可選多個(gè)

(?#...)

#號(hào)后的內(nèi)容將作為注釋

(?=...)

之后的字符串內(nèi)容需要匹配表達(dá)式才能成功匹配

(?!...)

之后的字符串不匹配表達(dá)式才能成功

(?<=...)

之前的字符串需要匹配表達(dá)式才能成功

(?<!...)

之前的字符串需要不匹配表達(dá)式才能成功

(?(id/name) yes |no)

如果編號(hào)為id/名字為name的組匹配到字符串,則需要匹配yes,否則匹配no,no可以省略

?

?

?

?

?

?

?

?

?

?

# "(?:...)" :()里面有?:表示該()不是分組 >>> import re >>> pat = re.compile(r"a(?:bc)") >>> pat.findall('abc') ['abc'] >>> pat.match('abc').groups() #顯示不出分組 () # "(?=...)":匹配...表達(dá)式,返回。對(duì)后進(jìn)行匹配,總是對(duì)后面進(jìn)行匹配 >>> import re >>> pat=re.compile(r'\w(?=\d)') #匹配表達(dá)式\d,返回?cái)?shù)字的前一位,\w:單詞字符[A-Za-z0-9] >>> pat.findall('abc1 def1 xyz1') ['c', 'f', 'z'] >>> pat.findall('zhoujy20130628hangzhou') #匹配數(shù)字的前一位,列表返回 ['y', '2', '0', '1', '3', '0', '6', '2'] >>> >>> pat=re.compile(r'\w+(?=\d)') >>> pat.findall('abc1,def1,xyz1') #匹配最末數(shù)字的前字符串,列表返回 ['abc', 'def', 'xyz'] >>> pat.findall('abc21,def31,xyz41') ['abc2', 'def3', 'xyz4'] >>> pat.findall('zhoujy20130628hangzhou') ['zhoujy2013062'] >>> import re >>> pat=re.compile(r'[A-Za-z]+(?=\d)') #[A-Za-z],匹配字母,可以用其他的正則方法 >>> pat.findall('zhoujy20130628hangzhou123') #匹配后面帶有數(shù)字的字符串,列表返回 ['zhoujy', 'hangzhou'] >>> pat.findall('abc21,def31,xyz41') ['abc', 'def', 'xyz'] >>> # "(?!...)" 不匹配...表達(dá)式,返回。對(duì)后進(jìn)行匹配 >>> import re >>> pat=re.compile(r'[A-Za-z]+(?!\d)') #[A-Za-z],匹配字母,可以用其他的正則方法 >>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310') ['zhouj', 'hangzho', 'binjian'] #匹配后面不是數(shù)字的字符串,列表返回 >>> pat.findall('abc21,def31,xyz41') ['ab', 'de', 'xy'] >>> # "(?<=...)":匹配...表達(dá)式,返回。對(duì)前進(jìn)行匹配,總是對(duì)前面進(jìn)行匹配 >>> import re >>> pat=re.compile(r'(?<=\d)[A-Za-z]+') #匹配前面是數(shù)字的字母 >>> pat.findall('abc21,def31,xyz41') [] >>> pat.findall('1abc21,2def31,3xyz41') ['abc', 'def', 'xyz'] >>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310') ['hangzhou'] >>> # "(?<!...)":不匹配...表達(dá)式,返回。對(duì)前進(jìn)行匹配,總是對(duì)前面進(jìn)行匹配 >>> import re >>> pat=re.compile(r'(?<!\d)[A-Za-z]+') #匹配前面不是數(shù)字的字母 >>> pat.findall('abc21,def31,xyz41') ['abc', 'def', 'xyz'] >>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310') ['zhoujy', 'angzhou', 'binjiang'] >>> #"(?(id\name) yes |no)": 組是否匹配,匹配返回 >>> import re #no省略了,完整的是a\dbc\d ==> a2bc3,總共5位,第2位是可有可無(wú)的數(shù)字,第5位是數(shù)字 >>> pat=re.compile(r'a(\d)?bc(?(1)\d)') >>> pat.findall('abc9') [''] #返回組1,但第2位(組1)沒有,即返回了'' >>> pat.findall('a8bc9') #完整的模式,返回組1 ['8'] >>> pat.match('a8bc9').group() 'a8bc9' >>> pat.match('a8bc9').group(1) '8' >>> pat.findall('a8bc') [] >>> #"(?iLmsux)":這里就介紹下i參數(shù):大小寫區(qū)分匹配 >>> import re >>> pat=re.compile(r'abc') >>> pat.findall('abc') ['abc'] >>> pat.findall('ABC') [] >>> pat=re.compile(r'(?i)abc') #(?i) 不區(qū)分大小寫 >>> pat.findall('ABC') ['ABC'] >>> pat.findall('abc') ['abc'] >>> pat.findall('aBc') ['aBc'] >>> pat.findall('aBC') ['aBC'] >>> >>> pat=re.compile(r'abc',re.I) #re.I 作為參數(shù)使用,同上作用,推薦 >>> pat.findall('aBC') ['aBC'] >>> pat.findall('abc') ['abc'] >>> pat.findall('ABC') ['ABC']

三、re模塊下的函數(shù)

?????????? 函數(shù)  

??????????? 描述

compile(pattern)

創(chuàng)建模式對(duì)象

search(pattern,string)

在字符串中尋找模式

match(pattern,string)  

在字符串開始處匹配模式

split(pattern,string)

根據(jù)模式分割字符串

findall(pattern,string)

列表形式返回匹配項(xiàng)

sub(pat,repl,string)

pat匹配想用repl替換

escape(string)

特殊字符轉(zhuǎn)義

1、compile:

>>> import re >>> pat = re.compile("A") >>> m = pat.search("CBA") >>> print(m) #匹配到了,返回MatchObject(匹配對(duì)象)(True) <_sre.SRE_Match object; span=(2, 3), match='A'> >>> m = pat.search("CBD") >>> print(m) #沒有匹配到,返回None(False) None >>> #上面的等價(jià)于,但推薦都用第一種方法,因?yàn)閷⒄齽t表達(dá)式轉(zhuǎn)換為模式對(duì)象,實(shí)現(xiàn)更有效率的匹配,其他的函數(shù)會(huì)在內(nèi)部進(jìn)行轉(zhuǎn)換。 >>> re.search("A","CBA") <_sre.SRE_Match object; span=(2, 3), match='A'> >>>

2、search:

>>> import re >>> m = re.search('asd','ASDasd') >>> print(m) <_sre.SRE_Match object; span=(3, 6), match='asd'> #匹配到了,返回MatchObject(True) >>> m = re.search('asd','ASDASD') >>> print(m) #沒有匹配到,返回None(False) None >>>

3、match:

>>> import re >>> m = re.match('a','Aasd') >>> print(m) None >>> m = re.match('a','aASD') >>> print(m) <_sre.SRE_Match object; span=(0, 1), match='a'>

4、split:

>>> import re >>> re.split(",","a,s,d,asd") ['a', 's', 'd', 'asd'] #返回列表 #等價(jià)于上 >>> pat = re.compile(',') >>> pat.split('a,s,d,asd') ['a', 's', 'd', 'asd'] >>> >>> re.split("[, ]+","a , s ,d ,,,,,asd") #正則匹配:[, ]+ ['a', 's', 'd', 'asd'] >>> re.split("[, ]+","a , s ,d ,,,,,asd",maxsplit=2) # maxsplit 最多分割次數(shù) ['a', 's', 'd ,,,,,asd'] >>> #說(shuō)明:根據(jù)模式的匹配項(xiàng)來(lái)分割字符串,類似字符串的split 的方法,但是字符串的split只能用固定長(zhǎng)度的分割符,而re.split允許用任意長(zhǎng)度和個(gè)數(shù)的分割符。

5、findall:

>>> import re >>> re.findall("a","ASDaDFGAa") ['a', 'a'] #列表形式返回匹配到的字符串 >>> pat = re.compile('a') >>> pat.findall('ASDaDFGAa') ['a', 'a'] >>> pat = re.compile('[A-Z]+') >>> pat.findall('ASDcDFGAa') ['ASD', 'DFGA']#說(shuō)明:列表形式返回給定模式的匹配項(xiàng)。返回所有匹配的字符串。

6、sub:

#通過組進(jìn)行更新替換: >>> import re >>> re.sub("a","A","abcasd") 'AbcAsd' >>> pat = re.compile("a") >>> pat.sub("A","abcasd") 'AbcAsd' >>> >>> pat=re.compile(r'www\.(.*)\..{3}') >>> pat.match('www.dxy.com').group(1) 'dxy' #通過正則匹配找到符合規(guī)則的”www.dxy.com“ ,取得組1字符串 去替換 整個(gè)匹配得到字符串。dxy -> www.dxy.com >>> pat.sub(r'\1','hello,www.dxy.com') 'hello,dxy' >>> pat=re.compile(r'(\w+) (\w+)') >>> s='hello world ! hello hz !' >>> pat.findall('hello world ! hello hz !') [('hello', 'world'), ('hello', 'hz')] #通過正則得到組1(hello),組2(world),再通過sub去替換。即組1替換組2,組2替換組1,調(diào)換位置。 >>> pat.sub(r'\2 \1',s) 'world hello ! hz hello !'#說(shuō)明:使用給定的內(nèi)容替換掉找到的字符串。a->A

7、escape:

#轉(zhuǎn)義 >>> import re >>> re.escape("www.dxy.cn") 'www\\.dxy\\.cn'#說(shuō)明:對(duì)字符串里面的特殊字符串進(jìn)行轉(zhuǎn)義。

四、re模塊下函數(shù)的方法

>>> import re >>> pat = re.compile('a') >>> dir(pat) ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn'] >>>

?

?方法

????????????? 描述

group

獲取子模式()的匹配項(xiàng)

start

給定組匹配項(xiàng)的開始位置

end

給定組匹配項(xiàng)的結(jié)束位置

span

給定組匹配項(xiàng)的開始結(jié)束位置

>>> import re >>> pat = re.compile(r'www\.(.*)\.(.*)') #用()表示一個(gè)組,2個(gè)組 >>> m = pat.match('www.dxy.com') >>> m.group() #默認(rèn)為0,表示匹配整個(gè)字符串 'www.dxy.com' >>> m.group(1) #返回給定組1匹配的子字符串 'dxy' >>> m.group(2) 'com' >>> m.start(2) #組2開始的索引 8 >>> m.end(2) #組2結(jié)束的索引 11 >>> m.span(2) #組2開始、結(jié)束的索引 (8, 11) >>>

五、正則表達(dá)式應(yīng)用場(chǎng)景練習(xí)

1、匹配一行文字中的所有開頭的字母內(nèi)容

>>> import re >>> s = "i love you not because of who you are, but because of who i am when i am with you" >>> pat = re.compile(r"\b\w") >>> pat.findall(s) ['i', 'l', 'y', 'n', 'b', 'o', 'w', 'y', 'a', 'b', 'b', 'o', 'w', 'i', 'a', 'w', 'i', 'a', 'w', 'y']

2、匹配一行文字中的所有開頭的數(shù)字內(nèi)容

>>> import re >>> s = "i love you not because 12sd 34er 56df e4 54434" >>> pat = re.compile(r"\b\d") >>> pat.findall(s) ['1', '3', '5', '5']

3、提取每行中完整的年月日和時(shí)間字段

>>> import re >>> s = """se234 1987-02-09 07:30:001987-02-10 07:25:00""" >>> pat = re.compile(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}") >>> pat.findall(s) ['1987-02-09 07:30:00', '1987-02-10 07:25:00'] >>> #re.M表示將字符串視為多行,從而^匹配每一行的行首,$匹配每一行的行尾 >>> re.findall(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}",s,re.M) ['1987-02-09 07:30:00', '1987-02-10 07:25:00']

4、將每行中的電子郵件地址替換為你自己的電子郵件地址

>>> import re >>> s = """693152032@qq.com, werksdf@163.com, sdf@sina.comsfjsdf@139.com, soifsdfj@134.compwoeir423@123.com""" >>> pat = re.compile(r"\w+@\w+.com") >>> pat.findall(s) ['693152032@qq.com', 'werksdf@163.com', 'sdf@sina.com', 'sfjsdf@139.com', 'soifsdfj@134.com', 'pwoeir423@123.com'] >>> >>> pat.sub("我愛你嘉大@163.com",s) '我愛你嘉大@163.com, 我愛你嘉大@163.com, 我愛你嘉大@163.com\n\n 我愛你嘉大@163.com, 我愛你嘉大@163.com\n\n 我愛你嘉大@163.com'

5、使用正則提取出字符串中的單詞

>>> import re >>> s="""i love you not because of who 234 you are, 234 but 3234ser because of who i am when i am with you""" >>> pat = re.compile(r"\b[A-Za-z]+\b") >>> pat.findall(s) ['i', 'love', 'you', 'not', 'because', 'of', 'who', 'you', 'are', 'but', 'because', 'of', 'who', 'i', 'am', 'when', 'i', 'am', 'with', 'you'] >>> words = pat.findall(s) >>> words = set(words) #將列表轉(zhuǎn)換為集合,去重復(fù) >>> print(words) {'with', 'when', 'because', 'i', 'am', 'are', 'you', 'not', 'who', 'but', 'love', 'of'} >>> len(words) 12

6、匹配一段文本中所有的身份證數(shù)字

>>> import re >>> s = """sfafsf,34234234234,1231313132,154785625475896587,sdefgr54184785ds85,4864465asf86845,15478562547589658X,15478562547589658x""" >>> pat = re.compile(r"\d{17,18}[X,x]?") >>> pat.findall(s) ['154785625475896587,', '15478562547589658X', '15478562547589658x'] >>>

7、匹配一個(gè)浮點(diǎn)數(shù)

>>> import re >>> s = "-1,-2.5,8.8,1,0" >>> pat = re.compile(r"[+|-]?\d+\.\d*") >>> pat.findall(s) ['-2.5', '8.8']

8、匹配漢字

>>> import re >>> s = "skda我愛嘉大。" >>> pat = re.compile(r"[\u4e00-\u9fa5]{0,}") #Unicode表中的漢字的頭和尾。 >>> pat.findall(s) ['', '', '', '', '我愛嘉大', '', ''] >>> for i in hanzi: #清除空字符串if i == '':hanzi.remove(i)else:continue >>> hanzi ['我愛嘉大']>>> import re >>> s = "skda我愛嘉大。" >>> pat = re.compile(r"[\u4e00-\u9fa5]{1,}") >>> pat.findall(s) ['我愛嘉大']

9、?匹配網(wǎng)址

>>> import re >>> s = """http://www.interoem.com/messageinfo.asp?id=35 http://3995503.com/class/class09/news_show.asp?id=14 http://lib.wzmc.edu.cn/news/onews.asp?id=769 http://www.zy-ls.com/alfx.asp?newsid=377&id=6 http://www.fincm.com/newslist.asp?id=415""" >>> s = s.splitlines() >>> pat = re.compile(r"http://.*(com/|cn/)") >>> for i in s:print(pat.match(i).group())http://www.interoem.com/ http://3995503.com/ http://lib.wzmc.edu.cn/ http://www.zy-ls.com/ http://www.fincm.com/ >>>

10、匹配合法的IP地址

>>> import re >>> s = "10.16.20.3" #這里可以改為用戶輸入的IP地址 >>> pat = re.compile("^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$") >>> pat.match(s).group() '10.16.20.3' >>>

11、?取出屬性data-original對(duì)應(yīng)的url

>>> import re >>> s = """<img data-original="https://rpic.douyucdn.cn/z1609/07/15/478748_160907150833.jpg" src="https://rpic.douyucdn.cn/z1609/07/15/478748_160907150833.jpg" style="display: block;">""" >>> pat = re.compile(r"<img data-original="(.*?)"") #雙引號(hào)單引號(hào)交叉使用 SyntaxError: invalid syntax >>> pat = re.compile(r'<img data-original="(.*?)"') >>> pat.findall(s) ['https://rpic.douyucdn.cn/z1609/07/15/478748_160907150833.jpg'] >>>

?

總結(jié)

以上是生活随笔為你收集整理的python核心编程第三版(一)学习笔记:正则表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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