正則表達式:能夠匹配文本片斷的模式(匹配模式pattern)python
字符串也是一種簡單的正則表達式正則表達式
通配符(能夠匹配任何字符):.函數
如'.ython'能夠匹配'python', 也能夠匹配'jython'this
字符集:用中括號[]括起來的字符集spa
如'[a-z]','[0-9]','[a-z-0-9]'分別表示字符a到z,0到9,a到z和0到9的任意一個code
子模式(subpattern):模式中的一部分,用括號括起來對象
如'py(tho)n','tho'爲一個子模式,也叫組(group),組序號取決於他左側的括號數,整個模式字符串爲第0組('python'),'tho'爲第1組(左側1個括號)blog
(pattern)*:容許模式重複0次或屢次字符串
(pattern)+:容許模式重複1次或屢次string
(pattern){m, n}:容許模式重複m到n次
如'py(tho)+n'表示中間的'tho'(第1組)能夠重複1次或屢次,能夠匹配'python',也能夠匹配'pythothothon'
反轉字符集:^
如'[^abc]'表示能夠匹配除a,b,c外的任何字符(注意加中括號!)
注意:若^出如今模式的開頭,須要對其進行轉義
管道符號:|(或)
如'p(ython|attern)'可匹配'python',也可匹配'pattern'
轉意符號(對特殊字符進行轉義):\
若是模式中有.,+,-,*,^,|,]等對匹配模式有特殊意義的符號,則須要進行轉義,如模式'www\.python\.org'中的.表示字符'.',而不是通配符
可選項:在子模式的括號外加?號,表示這個子模式無關緊要
如r'(http://)?(www\.)?python\.org'
能夠匹配如下字符串:
'http://www.python.org'
'http://python.org'
'www.python.org'
'python.org'
注意:若是?號在子模式的括號內,表示非貪婪模式,默認狀況下是貪婪模式,指出現重複運算符時,會盡量多的匹配,
如pattern = r'\*(.+)\*',遇到子字符串'*this* is *it*!'時,匹配的是最前面和最後面的*號,
若是令pattern = r'\*(.+?)\*',?號在括號內,則表示非貪婪模式,儘量少的匹配,會匹配前兩個*號,再匹配後兩個*號
匹配字符串開頭或結尾:若是隻想匹配在開頭或結尾出現模式的字符串,模式能夠用^(開頭)或$(結尾)
如pattern = '^ht+p'(注意不一樣於反轉字符集)會匹配'http://python.org','htttttttp://python.org',但不會匹配'python.http://org'
同理'$ht+p'會會匹配在結尾處出現模式的字符串
re.compile(pattern[, flags])
將以字符串形式寫的pattern轉爲真正的模式對象
如:
1 pattern = re.compile(r''' 2 \* # some text 3 ([^\*]+) # some text 4 \* # some text 5 ''', re.VERBOSE)
表示字符串'\*([^\*]+)\*'被轉換爲匹配模式,VERBOSE表示re會忽略在模式中添加的空白(空白字符,tab,換行符等)
re.search(pattern, string[, flags]) 或者 pat.search(string)
在字符串中尋找和模式相匹配的第一個子字符串,若能找到會返回MatchObject(值爲Ture),不然返回None(值爲False),如:
1 if re.search(pat, string): 2 print('found it!')
re.match(pattern, string[, flags])
在給定字符串開頭處匹配,有就返回MatchObject(值爲Ture),不然返回None(值爲False),
如re,match('p', 'python')返回MatchObject,re.match('p', 'www.python.org')返回None
re.split(pattern, string[, maxsplit=0])
用與模式相匹配的匹配項來分割字符串,如:
1 some_text = 'alpha, beta,,,, gamma delta' 2 print(re.split(',+', some_text))
結果:
['alpha', ' beta', ' gamma delta']
若是改爲:
1 some_text = 'alpha, beta,,,, gamma delta' 2 print(re.split('[, ]+', some_text))
結果:
['alpha', 'beta', 'gamma', 'delta']
(若是模式包含小括號,括起來的字符組合會散佈在分割後的子字符串之間)
re.findall(pattern, string)
以列表形式列出給定模式的全部匹配項
re.sub(pat, repl, string[, count=0])
用給定的替換式(repl)替換字符串string中的與pat相匹配的匹配項,返回替換後的string。如:
1 pat = '{name}' 2 text = 'dear {name}' 3 print(re.sub(pat, 'Mr.Tan', text))
結果:
dear Mr.Tan
re.escape(string)
對字符串中全部可能被解釋爲正則運算符的字符進行轉義,如:
1 pat = re.escape('www.(python)+.org') 2 print(pat) 3 text = 'www.python.org or www.pythonpython.org or www.(python)+.org will be replaced' 4 print(re.sub(pat, 'something', text))
結果:
www\.\(python\)\+\.org www.python.org or www.pythonpython.org or something will be replaced
匹配對象和組:
match,split,findall等能對字符串進行模式匹配的函數在找到匹配項後都會返回MatchObject對象,這些對象也包含匹配模式中與子模式相對應的
子字符串的信息和組(group)信息
group([group1, ...]) 獲取給定子模式(組)的匹配項
start([group]) 返回給定組的匹配項在字符串中的開始位置
end([group]) 返回給定組的匹配項在字符串中的結束位置
span([group]) 返回一個組的開始和結束位置
如:
1 m = re.match('www\.(.*)\.(.{3})', 'www.python.org') 2 print(m) 3 print(m.group(1), m.group(2)) 4 print(m.start(1), m.end(1), m.span(1))
結果:
<_sre.SRE_Match object; span=(0, 14), match='www.python.org'> python org 4 10 (4, 10)
re.sub()一個強大的功能:在替換內容(repl)中使用'\\n'表示repl中\\n處插入匹配項中第n組的子字符串!再用插入後的repl來替換匹配項!如:
1 emphasis_pat = r'\*([^\*]+)\*' 2 text = 'hello, *world*!' 3 print(re.sub(emphasis_pat, '<em>\\1</em>', text))
結果:
hello, <em>world</em>!