正則表達式提供了一種緊湊的表示法,可用於表示字符串的組合,一個單獨的正則表達式能夠表示無限數量的字符串。經常使用的5種用途:分析、搜索、搜索與替代、字符串的分割、驗證。python
(一)正則表達式語言
python中特殊字符有 \.^$?+*{}[]()|
一、字符類速記
^ 若是在字符類中第一個字符則表示否認;
- 表示一個字符範圍,若是做爲字符類中的第一個字符,就表示一個字面意義上的連字符;
. 能夠匹配除換行符以外的任意字符,或帶re.DOTALL標記的任意字符,或匹配字符類內部的字面意義的字符;
\d 匹配一個Unicode數字,或帶re.ASCII標記的[0-9];
\D 匹配一個Unicode非數字,或帶re.ASCII標記的[^0-9];
\s 匹配Unicode空白,或帶re.ASCII標記的[\t\n\r\f\v];
\S 匹配Unicode非空白,或帶re.ASCII標記的[^\t\n\r\f\v];
\w 匹配一個Unicode單詞字符,或帶re.ASCII標記的[a-zA-Z0-9_];
\W 匹配一個Unicode非單詞字符,或帶re.ASCII標記的[^a-zA-Z0-9_]正則表達式
二、量詞
格式{m,n},m與n分別表示使用該量詞的表達必須匹配的最少次數與最屢次數。若是隻給定一個數字則同時表示最小值最大值
量詞速記形式:
e{m} 準確匹配表達式e的m次出現
e{m,} 貪婪地匹配表達式e至少m次出現
e{m,}? 非貪婪地匹配表達式e至少m次出現
e{,n} 最多n次出現
e{,n}? 貪婪
e? e{0,1}
e?? e{0,1}?
e+ e{1,}
e+? e{1,}?
e* e{0,}
e*? e{0,}?
[] 匹配[]內的任意一個內容
() 將()的內容做爲一個總體來進行匹配
貪婪表示會盡能夠多的匹配符合條件的字符,非貪婪則爲盡能夠少的匹配。函數
三、可用air(craft|plane)來匹配 aircraft和airplane。
使用air(?:craft|plane)能夠用來限制當處於更多的嵌套中時,aricraft和airplane只有一次捕獲。圓括號表示組。spa
四、\i反向引用,i表示前面的捕獲號。捕獲號也能夠用在左圓括號前加 ?P<name>來用名稱代替
如:(?P<key>\w+)=(?P<value>.+)對於捕獲進行反向引用(?P=name): (?P<word>\w+)\s+(?P=word) 能夠使用名爲"word"的捕獲來匹配重複的單詞。code
五、正則表達式斷言:
^ 在起始處匹配,也能夠在帶MULTILINE標記的每一個換行符後匹配;
$ 在結尾處匹配,也能夠在帶MULTILINE標記的每一個換行符前匹配;
\A 在起始處匹配;
\b 在單詞邊界匹配,受re.ASCII影響,若是在字符內部則是backspace的轉義字符;
\B 在非單詞邊界匹配,受re.ASCII影響;
\Z 在結尾處匹配;
(?=e) 若是表達式e在此斷言處匹配,但沒有超出此處——稱爲前瞻或正前瞻,則匹配;
(?!e) 若是表達式e在此斷言處不匹配,但沒有超出此處——稱爲負前瞻,則匹配;
(?<=e) 若是表達式e恰在本斷言以前匹配——稱爲正回顧,則匹配;
(?<!e) 若是表達式e恰在本斷言以前不匹配——稱爲負回顧,則匹配;對象
六、正則表達式的註釋
可用(?#the comment)來實現,也可用re.VERBOSE標記。索引
(二)正則表達式模塊
正則表達式模塊標記:
re.A 或 re.ASCII
re.I 或 re.IGNORECASE 忽略大小寫
re.M 或 re.MULTILINE 使^在起始處並在每一個換行符後匹配,使$在結尾處但在每一個換行符以前匹配
re.S 或 re.DOTALL 使.匹配每一個字符,包括換行符
re.X 或 re.VERBOSE 使空白與註釋包含在匹配中
正則表達式模塊的函數(供查):
re.compile(r,f) 返回編譯後的正則表達式r,若是指定,就將其標記設置爲f(即上邊的re.A等,且可同時有多個標記,用|分隔);(使用re'regex'的形式表達字符串可不用轉義)
re.escape(s) 返回字符串s,其中全部非字母數字的字符都使用反斜線進行了轉義處理,所以,返回的字符串中沒有特殊的正則表達式字符;
re.findall(r,s,f) 返回正則表達式r在字符串s中全部非交疊的匹配(若是給定f,就受其制約)。若是正則表達式中有捕獲,那麼每次匹配都做爲一個捕獲元組返回;
re.finditer(r,s,f) 對正則表達式r在字符串s中每一個非交疊的匹配(若是給定了f,就受其制約),都返回一個匹配對象;
re.match(r,s,f) 若是正則表達式r在字符串s的起始處匹配(若是給定f,就受其制約),就返回一個匹配對象(MatchObject),不然返回None;
re.search(r,s,f) 若是正則表達式r在字符串s的任意位置匹配(若是給定f,就受其制約),就返回一個匹配對象,不然返回None;
re.split(r,s,m) 返回分割字符串s(在正則表達式r每次出現處進行分割)所產生的字符串的列表,至多分割m次(若是沒有給定m,就儘量多的分割),若是正則表達式中包含捕獲,就被包含在分割的部分之間;
re.sub(r,x,s,m) 對正則表達式r的每次匹配(若是給定m,那麼至多m次),返回字符串s的一個副本,並將其替換爲x--這能夠是一個字符串,也能夠是一個函數;
re.subn(r,x,s,m) 與re.sub()函數相同,區別在於此函數返回一個二元組;
匹配對象屬性與方法:
m.end(g) 返回組g(若是給定)在文本匹配的終點索引位置,對組0,則表示總體匹配;若是匹配中不包含該組,就返回-1;
m.endpos 搜索的終點索引位置
m.expands(s) 返回字符串s,並將其中捕獲標識用相應的捕獲替代;
m.group(g,...) 返回編號的或命名的組g,若是給定的不止一個,就返回相應的捕獲組成的元組;
m.groupdict(difault) 返回一個字典,其中存放全部命名的捕獲組,組名做爲鍵,捕獲做爲值;若是給定了default參數,就將其用做那些不參與匹配的捕獲組的值;
m.groups(default) 返回包含全部捕獲的元組,從1開始;若是給定default,就將其用做那此不參與匹配的捕獲組的值;
m.lastgroup 匹配的、編號最高的捕獲組的名稱,若是不存在或沒有使用名稱,就返回None;
m.lastindex 匹配的、編號最高的捕獲組的編號,若是沒有就返回None;
m.pos 搜索的起始索引位置;
m.re 產生這一匹配對象的正則表達式對象;
m.span(g) 若是給定g,就返回組g在文本中匹配的起始索引位置與結尾位置;(對組0,則是總體匹配);若是該組不參與匹配,就返回(-1,-1);
m.start(g) 若是給定g,就返回組g在文本中匹配的起始索引位置(對組0,則是總體匹配);若是該組不參加匹配,就返回-1;
m.string 傳遞給match()或search()的字符串;字符串