[Python]python正則入門–基本元字元匹配操作

來源:互聯網
上載者:User

正則對於文本文文書處理很好用,以前總是覺得很難似的,認真的學習一下發現入門還是很簡單的。
首先說的是元字元:
[] :-常用來制定一個字元集,只能匹配一個字元 [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操作,取字串的操作,每個單詞的邊界操作,等等都需要理解以後在做筆記



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.