cpython 标准库_Python re标准库
re模塊包含對正則表達式的支持。
一、什么是正則表達式
正則表達式是可以匹配文本片段的模式。最簡單的正則表達是就是普通字符串,可以匹配其自身。你可以用這種匹配行為搜索文本中的模式,或者用計算后的值替換特定模式,或者將文本進行分段。
1、通配符
點號(.)可以匹配任何字符(除了換行符),但點號只能匹配一個字符,而不是零個或多個;
如.ython可以匹配字符串‘python’或‘jython’,或‘+ython’等等,但是不會匹配‘cpython’或‘ython’;
因為它可以匹配除換行符外的任何單個字符,所以點號就稱為通配符。
注:點號是特殊字符,需對它進行轉義。可以加上反斜線“cnblogs\\.com”或者使用原始字符串“r'cnblogs\.com'”;
2、字符集
可以使用中括號括住字符串來創建字符集。字符集可以匹配它所包括的任意字符;
如‘[pj]ython’可以匹配python或jython;比如‘[a-z]’可以匹配a到z的任意一個字符;
也可以通過一個接一個的方式將范圍聯合起來使用,比如‘[a-zA-Z0-9]’可以匹配任意一個小寫或大寫字母或0到9的數字;
可以在開頭使用‘^’反轉字符集,匹配除字符集外的其它字符;如‘[^abc]’可以匹配任何除了a\b\c之外的字符。
3、選擇符和子模式
管道符號(|)可以用于選擇項;如匹配python和perl,可以寫成‘python|perl’
當只是模式的一部分進行選擇時,可以使用圓括號括起需要的部分,或稱為子模式。如匹配python和perl,可以寫成‘p(ython|erl)’
4、可選項和重復子模式
在子模式后面加上句號,它就變成了可選項,即表示子模式可以出現一次或者根本不出現。
如r'(http://)?(www\.)?python\.org'只能匹配到下列字符串,而不會匹配其它的:
http://python.org
http://www.python.org
www.python.org
python.org
上述例子,值得注意的是:
(1)對www.和python.org之間的點號進行了轉義,防止它被作為通配符使用;
(2)使用原始字符串“r”減少所需反斜線的數量;
(3)每個可選子模式都用圓括號括起;
(4)可選子模式出現與否均可,而且互相獨立;
使用下面這些運算符允許子模式重復多次:
(pattern)*:允許模式重復0次或多次;
(pattern)+:允許模式重復1次或多次;
(pattern){m,n}:允許模式重復m~n次;
例如,r'w*\.python\.org'會匹配'www.python.org',也會匹配'.python.org’;
5、字符串的開始和結尾
如果想在字符串的開頭而不是其他位置匹配,可以使用脫字符(^)標記開始;
如‘^ht+p’會匹配‘http://python.org’或'htttp://python.org',但不匹配‘www.http.org’;
使用美元符號($)標志字符串結尾。
二、re模塊的內容
re模塊包含一些有用的操作正則表達式的函數:
函數re.compile將正則表達式(以字符串書寫的)轉換為模式對象,可以實現更有效率的匹配。如果調用search或者match函數的時候使用字符串表示的正則表達式,它們也會在內部將字符串轉換為正則表達式對象。 使用compile完成一次轉換后,在每次使用模式的時候就不用進行轉換。
函數re.search會在給定字符串中尋找第一個匹配給定正則表達式的子字符串。一旦找到子字符串,函數就會返回MathObject(值為True),否則返回None(值為False)。
函數re.match會在給定字符串的開頭匹配正則表達式。如match('p','python')返回真,而re.match('p','www.python')則返回假。
函數re.split會根據模式的匹配項來分隔字符串。參數maxsplit表示字符串最多可以分隔的次數:
importre
text= 'a,b,,,,c d'
##正則表達式中,匹配逗號和空格
listvalue= re.split('[, ]+',text)print(listvalue) #['a', 'b', 'c', 'd']
print(re.split('o(o)','foobar')) #['f', 'o', 'bar']
print(re.split('[, ]+',text,maxsplit=1)) #['a', 'b,,,,c d']
函數re.findall以列表形式返回給定模式的所有匹配項。
pat = '[a-zA-Z]'text2= '"aq," bp,,,,ct rd'
print(re.findall(pat,text2)) #['a', 'q', 'b', 'p', 'c', 't', 'r', 'd']
函數re.sub的作用在于:使用給定的替換內容將匹配模式的子字符串(最左端并且非重疊的子字符串)替換掉。
pat3 = '{name}'text3= 'Dear {name}'
print(re.sub(pat3, 'Jame', text3)) #Dear Jame
函數re.escape可以對字符串中所有可能被解釋為正則運算符的字符進行轉義。
print(re.escape('www.python.org')) #www\.python\.org
三、匹配對象和組
re模塊函數能找到匹配項時,它們會返回MathObject對象,這些對象包括匹配模式的子字符串的信息,它們還包含了哪個模式匹配了子字符串哪部分的信息,這些部分叫做組(group)。
即組就是放置在圓括號內的子模式。組的序號取決于它左側的括號數。組0就是整個模式。
如在下面的模式中:‘there (was a (wee) (cooper)) who (lived in fyfe)’,包含下面這些組:
0?there was a wee cooper who lived in fyfe
1?was a wee cooper
2 wee
3 cooper
4 lived in fyfe
注:這里要區分前面提到的字符集,字符集兩邊是用中括號括起的,而組是用原括號括起的。
如r'www\.(.+)\.com$' 可以匹配'www.python.com';組0就是‘www.python.com’,組1就是python。
re匹配對象存在以下重要方法:
上訴方法中,[group1]指的是組號。如果沒有給定組號,則默認為組0.
m = re.match(r'www\.(.*)\..{3}', 'www.python.org')print(m.group(1)) #python
print(m.start(1)) #4
print(m.end(1)) #10
print(m.span(1)) #(4, 10)
重復運算符的匹配是貪婪的,即它會盡可能多的匹配。
在重復運算符后面加上一個問號可以變為非貪婪的。
pat4 = r'\*\*(.+?)\*\*'pat5= r'\*\*(.+)\*\*'
print(re.sub(pat4,r'\1','**this** is **it**!')) #this is it!
print(re.sub(pat5,r'\1','**this** is **it**!')) #this** is **it!
這里用+?運算符代替了+,意味著模式也會像之前那樣對一個或者多個通配符進行匹配,但是它會進行盡可能少的匹配,因為它是非貪婪的。
讓正則表達式變得更加易讀的方式是在re函數中使用VERBOSE標志:
em_pat = re.compile(r'''\* #匹配的第一個字符是星號
\* #匹配的第二個字符是星號,這里前面斜杠是轉義
( #匹配組左側圓括號
. #匹配任意字符
+ #任意字符可以是1個或多個
) #匹配組右側括號
\*\* #匹配的字符后面跟著兩個星號''',re.VERBOSE)print(re.sub(em_pat,r'\1','**this** is **it**!')) #this** is **it!
四、實例
文件中存在以下文字:
From foo@bar.baz Thu Dec
Subjec:Re:Span
From:Foo fie
to:Magnus
現在要從文件中找出是誰發送的郵件,我們可以在‘From:Foo fie ’中找到發件人Foo fie.實現查找:
pat6 = re.compile('From:(.*) <.>$')for line infileinput.input():
m=pat6.match(line)if m:print m.group(1)
本文主要摘自《Python基礎教程》一書
持續學習中,,,
總結
以上是生活随笔為你收集整理的cpython 标准库_Python re标准库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取数据 - 将Excel文件读入矩阵m
- 下一篇: termux配置python安装kali