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,但是儘量加上,按照正確格式來)