一.基礎知識:
\d 匹配乙個數字
\w 匹配乙個字母或數字
. 匹配任意字元
* 表示任意個字元
+ 表示至少乙個字元
? 表示0個或1個字元
表示n個字元, 表示n - m個字元
\s 表示匹配乙個空格(包括tab等空白符),\s+表示至少乙個空格
[0-9a-za-z\_] 可以匹配乙個數字、字母或者下劃線
[0-9a-za-z\_]+ 可以匹配至少由乙個數字、字母或者下劃線組成的字串
[a-za-z\_][0-9a-za-z\_]* 可以匹配由字母或下劃線開頭,後接任意個由乙個數字、字母或者下劃線組成的字串
[a-za-z\_][0-9a-za-z\_] 限制前面只有乙個字元+後面最多19個字元
a|b可以匹配a或b
^ 表示行的開頭
$ 表示行的結束
注意:特殊字元需要用\進行轉義,但如果使用python的r字首,就不用考慮轉義的問題。
二.re模組
match方法判斷是否匹配,如果匹配成功,返回乙個match物件,否則返回none
import re
test='010-12345'
if re.match(r'^\d-\d$', test):
print 'ok'
else:
print 'failed'
三.切分字串
用正規表示式切分字串更為靈活:
import re
# 常規切分 ['a', 'b', '', '', 'c']
print 'a b c'.split(' ')
# 使用正則, 可以識別連續空格 ['a', 'b', 'c', 'd']
print re.split(r'[\s\,]+', 'a,b, c d')
# 使用正則, 可以識別按照多個字元切分 ['a', 'b', 'c', 'd']
print re.split(r'[\s\,\;]+', 'a,b;; c d')
四.分組
正規表示式有提取子串的功能,使用()表示要提取的分組(group)
如下:可以從匹配的字串中提取出區號和本地號碼
import re
m = re.match(r'^(\d)-(\d)$', '010-12345')
print m.group(0) # '010-12345'
print m.group(1) # '010'
print m.group(2) # '12345'
五.貪婪匹配
正則匹配預設是貪婪匹配,也就是盡可能多的字元:
import re
print re.match(r'^(\d+)(0*)$', '102300').groups()
# ('102300', '')
由於\d+採用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配空字串了。
必須讓\d+採用非貪婪匹配,也就是盡可能少匹配,才能把後面的0匹配出來,加個?就可以讓\d+採用非貪婪匹配
re.match(r'^(\d+?)(0*)$', '102300').groups() # ('1023', '00')
六.編譯
當我們在python中使用正規表示式時,re模組內部會幹兩件事情:
1. 編譯正則,如果正則的字串本身不合法,會報錯;
2.用編譯後的正則去匹配字串
如果乙個正則要重複使用很多次,出於效率考慮,我們可以進行預編譯,下次使用就不用編譯了
import re
# 編譯:
re_telephone = re.compile(r'^(\d)-(\d)$')
# 使用:
re_telephone.match('010-12345').groups() #('010', '12345')
re_telephone.match('010-8086').groups() #('010', '8086')
python學習筆記 十一 正規表示式
一.基礎知識 d 匹配乙個數字 w 匹配乙個字母或數字 匹配任意字元 表示任意個字元 表示至少乙個字元 表示0個或1個字元 表示n個字元,表示n m個字元 s 表示匹配乙個空格 包括tab等空白符 s 表示至少乙個空格 0 9a za z 可以匹配乙個數字 字母或者下劃線 0 9a za z 可以匹...
18十一正睿筆記
前提 滿足四邊形不等式 若i a b i a b w a,j i,j w a b w i,b w a,j w i,b w a j i,j w a b 相當於決策點是不降的。把序列分成k段,每段的價值為w i j w i,j w i,j ex 和的平方 d pi k m in d pj,k 1 w j...
standford NLP課程筆記一 正規表示式
課程位址 裡面的字元表示每個都可以,比如 ww oodchuck 可以表示woodchuck和woodchuck 1234567890 表示任何單個數字 表示範圍的 a z 表示所有大寫字母 a z 表示所有小寫字母 0 9 表示所有單個數字 表示否定的 a z 不要大寫的字母 a z 不要小寫的字...