1. 程式人生 > >python入門之正則表示式

python入門之正則表示式

正則

  通過re模組實現

  eg:>>>import re

          >>>re.findall('abc',str_name)

  在strname裡面完全匹配字串abc,返回列表['abc'],有多個則返回多個相同的元素,若沒有,則返回空列表。優先取出組裡面的內容,在小括號開頭加上?:就可以去掉優先獲取組裡內容的許可權

 

元字元

  .  表示匹配單個字元,除了換行符

    re.findall('a.c',djsdsdabcdw')返回列表的元素為abc

  ^  表示以什麼開頭

    re.findall('^abc','abcoweijdw')返回列表的元素為abc

  $  表示以什麼結尾

    re.findall('abc$','elkjfwlabc')返回列表的元素為abc

  *  表示匹配前一個字元零到多次

    re.findall('abc*','efwkabcccccclo')也可以匹配到ab,貪婪匹配,匹配最多次

  +  表示匹配前一個字元一到多次

    re.findall('abc+','sdfabcccdcw')不能匹配到ab,至少匹配到abc

  ?  表示匹配前一個字元零次和一次

    re.findall('abc?','sdabcewwabsef')返回的列表元素是ab和abc

  {}  表示匹配前一個字元n次,數字n放在括號裡

    abc{3}只能匹配abccc,也可以寫區間{3,5},匹配前面的內容3到5次

  \  後跟元字元,則去除元字元的特殊功能

     後邊跟普通字元,則實現特殊功能

    \d 任何十進位制數,同[0-9]

    \D 同[^0-9]

    \s 匹配任何空白字元,同[\t\n\r\f\v]

    \S 與\s相反

    \w 同[a-zA-Z0-9]

    \W 與\w相反

    \b 匹配單詞邊界,分割與特殊字元之間的地方

 

字符集

  [ ]  a[bc]d 只能匹配abd和acd

     [a-z] [A-Z] [1-9]

  ^  [^1-9] 匹配除了1到9的字元

  ()  (ab)* 匹配ab字串 零個到多個

  |  或

 

函式

  re.search('abc','sefabcsefwabc').group()

    只匹配找到的第一個滿足的字串返回,後面就不匹配了,返回的並不是列表,是字串

  re.findall(r"a(\d+)","a4394dfgr)

    匹配括號裡的,返回4394

  re.search(r"a(\d+)","a4394dfgr").group()

    貪婪匹配,返回a4394

  re.search(r"a(\d+?)","a4394dfgr").group()

    非貪婪匹配,返回a4

    可將+換成*。另外括號後面有個限制條件,如a(\d+?)b,這樣非貪婪匹配就不起作用了,有無?都是一樣的

  re.match(被匹配字串,匹配字串,flag)

    其中,flag常用取值:

      re.I 不區分大小寫

      re.S 使.匹配包括換行符在內的所有字元

    match匹配到的是一個match物件,需要用group()方法去取匹配的字串,引數預設為0,取匹配到所有的內容,若是n,則返回第n個組的內容,也就是第n個小括號裡匹配到的內容

    groups()方法獲取組裡的內容,返回一個元組,一個組裡的內容就是元組的一個元素

    groupdict()方法,在組內開頭加上 ?P<"asdfa">,就能返回一個字典,由自己定義的鍵“asdfa”和組的內容組成鍵值對

    start() 返回匹配開始的位置

    end() 返回結束位置

    span() 返回一個元組,包含匹配的開始和結束的位置

  re.sub(被替換的字串,替換成此字串,str_name,替換次數)

  re.subn(被替換的字串,替換成此字串,str_name)

    此方法匹配到的全部替換,在返回的列表最後加一個元素,這個元素是替換的次數

  re.compile()定義一種匹配規則,用來多次呼叫

    eg:

      regex = re.compile(r'\w*oo\w*')

      print regex.findall(str_name)

 

例項:

  取算數表示式裡最裡面的小括號表示式,括號裡沒有括號的表示式

  re.search("\([^()]\)",表示式).group()

    若最裡面有多個小括號表示式,則要加*

    re.search("\([^()]*\)",表示式).group()

  

  匹配一個數,可整型,可浮點型,可1位數,可多位數

  '\d+\.?\d*'

    前面必須為+,至少是一位的數,那麼後面必須是*,可為0次,若還是為+,則後面至少還是有一位的,那麼整體就至少是二位的數了,中間的?表示匹配浮點型或者不是

  

  兩個數運算的表示式

  '\d+\.?\d*([*/]|\*\*)\d+\.?\d*'

    其中,[*/]|\*\*表示乘除冪運算

 

  匹配ip地址

  "([01]?\d?\d|2[0-4]\d|25[0-5]\.){3}([01]?\d?\d|2[0-4]\d|25[0-5])"

    其中,[01]?\d?\d|2[0-4]\d|25[0-5] 表示從0到199,200到249,250到255

 

補充:

  re.split("\\\\","abc\xyz")

    後面的字串中的\在python裡面需要轉義,其實是\\,所以分割的話,需要用兩個\,而需要的兩個\又是需要轉義的,所以就是\\\\

  re.split(r"\\","abc\xyz")

    前面被匹配的字串中如果有各種轉義字元,會先去python自己裡面檢視有沒有(其中\d沒在,其他字元在ASCII裡面都有對應的數字),有的話,就按python裡對應字元來匹配(若不想按python裡面的字元匹配,則前面加一個\,或者在整個匹配字串前面加一個r),如果沒有,就按re模組裡定義的特殊功能來匹配(例如\d,可以不用另外加\或者加r,但是儘量加上,按照正確格式來)