python模块的分类有哪些_python之模块分类(六)
一、概念
re模塊是python獨有的匹配字符串的模塊,該模塊中提供的很多功能是基于正則表達式實現的,而正則表達式是對字符串進行模糊匹配,提取自己需要的字符串部分,他對所有的語言都通用。注意:
re模塊是python獨有的
正則表達式所有編程語言都可以使用
re模塊、正則表達式是對字符串進行操作
二、常用正則表達式符號
'.' 默認匹配除\n之外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行
'^' 匹配字符開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*' 匹配*號前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 結果為['abb', 'ab', 'a']
'+' 匹配前一個字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb']
'?' 匹配前一個字符1次或0次
'{m}' 匹配前一個字符m次
'{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC'
'(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c
'\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符結尾,同$
'\d' 匹配數字0-9
'\D' 匹配非數字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'
'(?P...)' 分組匹配 re.search("(?P[0-9]{4})(?P[0-9]{2})(?P[0-9]{4})","371481199306143242").groupdict("city") 結果{'province': '3714', 'city': '81', 'birthday': '1993'}
三、常用方法
1、re.compile(pattern,flags = 0 )
將正則表達式模式編譯為正則表達式對象,可使用match(),search()以及下面所述的其他方法將其用于匹配
#Author:Anliu
import re
#res = re.match("^Chen","Chenrunrun123")
#print(res)
#print(res.group())
prog = re.compile('\d{2}') #定義正則對象,(匹配兩個數字)
print(prog.search("12bbc").group()) #通過調用group()方法得到匹配的字符串,如果字符串沒有匹配。則返回None、
print(prog.search("wwww.123.com").group())
2、re.search(pattern,string,flags = 0 )
掃描字符串以查找正則表達式模式產生匹配項的第一個位置 ,然后返回相應的match對象。None如果字符串中沒有位置與模式匹配,則返回;否則返回false。請注意,這與在字符串中的某個點找到零長度匹配不同。
#在字符串中匹配
print(re.search('\w+','abcde').group())
print(re.search('a','bcdea').group())
3、re.match(pattern,string,flags = 0 )
如果字符串開頭的零個或多個字符與正則表達式模式匹配,則返回相應的匹配對象。None如果字符串與模式不匹配,則返回;否則返回false。請注意,這與零長度匹配不同。
#Author:Anliu
import re
#同search,不過在字符串開始處進行了匹配,只會匹配一個對象
print(re.search('a','absabc').group())
print(re.match('a','absabc').group())
print(re.search('\D+','abc123com').group()) #非數字
print(re.match('\D+','abc123com').group())
print(re.search('\d+','abc123com').group())
#print(re.match('\d+','abc123com').group()) #match報錯
4、re.fullmatch(pattern,string,flags = 0 )
如果整個字符串與正則表達式模式匹配,則返回相應的match對象。None如果字符串與模式不匹配,則返回;否則返回false。請注意,這與零長度匹配不同。
print(re.fullmatch('\w+',"abc123").group())
#print(re.fullmatch('abc','abcd').group()) #報錯
print(re.fullmatch('abcd','abcd').group())
5、re.split(pattern,string,maxsplit = 0,flags = 0 )
通過出現模式來拆分字符串。如果在pattern中使用了捕獲括號,那么模式中所有組的文本也將作為結果列表的一部分返回。如果maxsplit不為零,則最多會發生maxsplit分割,并將字符串的其余部分作為列表的最后一個元素返回。
print(re.split('[ab]','abcd')) #先按‘a’分割得到‘’和‘bcd’,在對‘’和‘bcd’分別按‘b’分割
print(re.split(r'\W+','Words,words,words.'))
print(re.split(r'(\W+)','Words,words,words.'))
print(re.split('[a-f]+','0a3B9',flags=re.IGNORECASE))
6、re.findall(pattern,string,flags = 0 )
以string列表形式返回string中pattern的所有非重疊匹配項。從左到右掃描該字符串,并以找到的順序返回匹配項。如果該模式中存在一個或多個組,則返回一個組列表;否則,返回一個列表。如果模式包含多個組,則這將是一個元組列表。空匹配項包含在結果中。
print(re.findall('a','This is a tast from a!'))
結果:
['a', 'a', 'a']
7、re.finditer(pattern,string,flags = 0 )
返回一個迭代器,該迭代器在string類型的RE 模式的所有非重疊匹配中產生匹配對象。 從左到右掃描該字符串,并以找到的順序返回匹配項。空匹配項包含在結果中。
a = re.finditer('[ab]','This is a tast from a!') #返回迭代器對象
for i in a:
print(i.group())
8、re.sub(pattern,repl,string,count = 0,flags = 0 )
返回通過用替換repl替換字符串中最左邊的不重疊模式所獲得的字符串。如果找不到該模式, 則返回的字符串不變。 repl可以是字符串或函數;如果是字符串,則處理其中的任何反斜杠轉義。即,將其轉換為單個換行符,將其轉換為回車,依此類推。count參數表示將匹配到的內容進行替換的次數。
print(re.sub('\d','S','abc12kkakla1wk21',2)) #將匹配到的數字替換成s,替換2個
9、re.subn(pattern,repl,string,count = 0,flags = 0 )
執行與相同的操作sub(),但返回一個元組。(new_string, number_of_subs_made)。
有的時候我們需要使用一些特殊符號如”$ * . ^”等的原意,有時候需要被轉義后的功能,并且轉義字符地使用很繁瑣,容易出錯。
re.escape(pattern) 可以對字符串中所有可能被解釋為正則運算符的字符進行轉義的應用函數。如果字符串很長且包含很多特殊技字符,而你又不想輸入一大堆反斜杠,或者字符串來自于用戶(比如通過raw_input函數獲取輸入的內容),且要用作正則表達式的一部分的時候,可以使用這個函數。
print(re.escape('www.python.org'))
print(re.findall(re.escape('w.py'),"jw.py w.py.f"))
結果:
www\.python\.org
['w.py', 'w.py']
四、實例
(1)查找"http://www.python.org"中的python并替換為java
#Author:Anliu
import re
line = "http://www.python.org"
pat = "(?<=\.).+(?=\.)"
patobj = re.compile(pat)
print(re.search(pat,line))
print(re.search(patobj,line))
print(patobj.search(line))
'''
函數re.search在給定字符串中查找第一個與指定pat匹配的子串,如果找到將返回MatchObject(結果為True),否則為None.(結果為False)
觀察結果,發現MatchObject的匹配子串為'python',起始與終止位置為11,17
'''
line1 = re.sub(pat,'java',line)
line2 = patobj.sub('java',line)
print(line1)
print(line2)
'''
函數re.match嘗試在給定字符串開頭查找與正則表達式匹配的子串,和re.search相似,如果找到這樣的子串,返回MatchObject,否則返回None
另外,re.match在模式與字符串開頭匹配時就返回True,而不要求與整個字符串匹配,如果要求完全匹配,需要在模式末尾加上$,從而將匹配檢查延伸到整個字符串.
'''
(2)找出以http協議開頭的網址
#Author:Anliu
import re
#方法一
#line1 = "http://www.python.com"
#line2 = "ftp://www.python.com"
#pat = "^http.*"
#patobj = re.compile(pat)
##print(re.search(patobj,line))
#print(patobj.search(line1))
#print(patobj.search(line2))
#方法二:
line1 = "http://www.python.com"
line2 = "ftp://www.python.com"
pat = "http.*"
patobj = re.compile(pat)
print(patobj.match(line1))
print(patobj.match(line2))
總結
以上是生活随笔為你收集整理的python模块的分类有哪些_python之模块分类(六)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++入门必看
- 下一篇: 基于Nokia S60的游戏开发之二