正則對於文本文文書處理很好用,以前總是覺得很難似的,認真的學習一下發現入門還是很簡單的。
首先說的是元字元:
[] :-常用來制定一個字元集,只能匹配一個字元 [abc] 匹配a,b或者 c
-其他的元字元在[]中不起作用
- '^'表示補集,'-'表示範圍
import rer='a[abc]c're.findall(r,'abc aac adc ')['abc', 'aac']r=r'a[bcd$]'re.findall(r,'ad')['ad']re.findall(r,'ab')['ab']r=r'[^abc]dd're.findall(r,'add cdd fdd')['fdd']r=r'[a-z]bc're.findall(r,'bbc ...abc')['bbc', 'abc']
^ :匹配行首
r=r'^abc're.findall(r,'abcd ...')['abc']re.findall(r,'bcd ...')[]
$ :匹配行尾
r='abc$'re.findall(r,'bcd ...ab')[]re.findall(r,'bcd ...abc')['abc']
\ :轉義 如果我們要去匹配的字元中含有元字元就會用到
#匹配字串 ^#
r=r'\^#'re.findall(r,'ddcd ^# nihao ')['^#']r=r'^#' #不用轉義就無法匹配的到re.findall(r,'ddcd ^# nihao ')[]
其他的\常用組合:
\d 匹配任何十進位數字 [0-9]
\D 匹配任何非數字字元 [^0-9]
\s 匹配任何空白字元: [\t\n\r\f\v]
\S 匹配任何非空白字元 [^\t]\n\r\f\v]
\w 匹配任何字母數字字元 [a-zA-Z0-9]
\W 匹配任何非字母數字字元 [^a-zA-Z0-9]
. 匹配任何字元 出了分行符號以外
#例如匹配0561-4564620之類的電話號碼r=r'\d\d\d\d-\d\d\d\d\d\d\d're.findall(r,'4567-3451234')['4567-3451234']#例如匹配只有3位字母數字組成的126郵箱r=r'\w\w\w@126.com're.findall(r,'ly1@126.com')['ly1@126.com']re.findall(r,'ly*@126.com') #特殊字元就無法匹配的到[]re.findall(r,'45673451234')[]#例如密碼必須6位字元r=r'^......$'re.findall(r,'11111')[]re.findall(r,'11111e')['11111e']re.findall(r,'11111e5')[]
上面例子限制的條件都很少,因為我們每次都只能用一個元字元限定一個字元的匹配,如果是匹配任意長得字元,或者不定長度的字元呢 或者字元中有些字元可以有也可以沒有呢
例如電話號碼 010-3333333 0103333333 05614444444 0561-3333333 前面是3位或者4位中間'-'可有可無最後是7位元字的呢? 這就用到多重複匹配的元字元了
* 制定前面的一個字元可以匹配0次或者是多次
a[bcd]*b --'abb' 'abbbccddb' 不限制次數只要匹配到就可以
r=r'\d*b' #匹配數字後面有個d的串,不管前面多少個數字,甚至0個都行re.findall(r,'333b 4444 d4d')['333b']re.findall(r,'333b 4444 d4d b')['333b', 'b']
+ -表示匹配一次或者多次, 至少要有一次
#看看和*的不同r=r'\d+b're.findall(r,'333b 4444 d4d b 3b') #這裡的b就沒法匹配到了,因為前面至少要有一個數字['333b', '3b']
?匹配0次或者一次,可以有可以沒有,最多隻能有一個
r=r'\d-?\d're.findall(r,'3-4 34 3--4 d-4')['3-4', '34'] #有2個'-'的就無法匹配到了
| :或得匹配,也就是經常用得or的意思
{n} {m,n} :可以精確的匹配次數,或者範圍
#例如上面的電話號碼的例子r=r'^\d{3,4}-?\d{7}'re.findall(r,'0104444444')['0104444444']re.findall(r,'010-4444444')['010-4444444']re.findall(r,'0101-4444444')['0101-4444444']re.findall(r,'01014444444')['01014444444']re.findall(r,'010144444444') #為什麼8位也行呢,原來沒有制定7個數字結尾['01014444444']r=r'^\d{3,4}-?\d{7}$'re.findall(r,'010144444444')[]
那這裡我們是不是可以用{}來代替上面的 * + ?呢,當然可以
* {0,} +{1,} ?{0,1}
但是不建議那麼用,還是用符號比較好
下面來說說re模組的一些方法:
re.compile() 當我們經常使用一些正則的時候就可以對他們進行先行編譯,然後使用,這樣效率會提高。
r=r'^\d{3,4}-?\d{7}$'res=re.compile(r)<_sre.SRE_Pattern object at 0x0299B728> #產生一個正則對象res.findall('0103333333')['0103333333']
這裡只是簡要的入門下,還有些元字元和很多的re模組的用法需要多練習,貪婪和非貪婪匹配,search和match匹配的不同,還有一些split操作,取字串的操作,每個單詞的邊界操作,等等都需要理解以後在做筆記