正則表達式語法:
符號 | 意義 |
. | 表示任意字符,如果說指定了 DOTALL的標識,就表示包括新行在內的所有字符。 |
^ | 表示字符串開頭。 |
$ | 表示字符串結尾 |
*,+,? | '*'表示後面可跟 0 個或多個字符,'+'表示後面可跟 1 個或多個字符,'?'表示後面可跟 0 個或多個字符 |
*?,+?,?? | 在上面的結果中只取第一個(非貪婪表達式) |
{m} | 對於前一個字符重複 m 次 |
{m,n} | 對於前一個字符重複 m 到 n 次 |
{m,n}? | 對於前一個字符重複 m 到 n 次,並且取儘可能少的情況 |
\ | 對特殊字符進行轉義,或者是指定特殊序列 |
[] | 表示一個字符集 |
| | 或者,只匹配其中一個表達式 |
(...) | 匹配括號中的任意正則表達式 |
(?#...) | 註釋,忽略括號內的內容 |
(?=...) | 表達式’…’之前的字符串 |
(?!...) | 後面不跟表達式’…’的字符串 |
(?<= …) | 跟在表達式’…’後面的字符串符合括號之後的正則表達式 |
(?<! …) | 括號之後的正則表達式不跟在’…’的後面 |
(?ailmsux) |
(使用一個或多個字符 'a' , 'i' , 'L' , 'm' , 's' , 'u' , 'x' .)分別對應這些正則標誌符號: re.A (ASCII-onlymatching), re.I (ignorecase),re.L (localedependent),re.M (multi-line), re.S (dot matchesall), |
(?:...) | 正則括號的非捕獲版本. 匹配括號內的任何正則表達式,但是組裏匹配的子字符串在執行了匹配或者被之後的規則引用後將不能被獲取 |
(?imsx-imsx:…) |
(使用零個或多個字符'i','m','s','x','-'可選) 表示設置或去除相應的標誌符號: re.I (ignorecase), re.M(multi-line), re.S (dotmatches all), and re.X (verbose),for the part of the expression.(The flags are described in ModuleContents.)New in version 3.6. |
(?P<name>...) | 和用括號的正則類似,但是name可以關聯匹配到的字符串,作爲分組名稱 |
(?P=name) | 與上面命名的用法連用,用來代指匹配F到的字符串 |
(?(id/name)yes - | 如果給定的組id或name存在,就通過 |
pattern|no-pattern) | yes-pattern去匹配,否則通過no-pattern匹配no-pattern是可選的,可以去掉. |
特殊表達式序列 |
特殊表達式序列 意義 |
\A |
只在字符串開頭進行匹配 |
\b |
匹配位於開頭或者結尾的空字符串 |
\B |
匹配不位於開頭或者結尾的空字符串 |
\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_] |
\Z |
只在字符串結尾進行匹配 |
RE使用步驟:
1、使用complie將表示正則的字符串編譯爲一個pattern對象
2、通過pattern對象提供一系列方法對文本進行查找匹配,獲得匹配結果,一個Match對象
3、最後使用Match對象提供的屬性和方法獲得信息,根據需要進行操作
RE常用函數:
1、re.complie(strPattern[,flag]):對字符串編譯成一個pattern對象。第二個參數flag爲匹配模式,可以使用‘|’符號同時啓用多種模式,如re.I|re.M
>>>p = re.compile(r'\d')
>>>p
re.compile('\\d')
flag選值:
re.I (IGNORECASE):忽略大小寫
re.M (MULTILINE):多行模式,改變'^'和'$'的行爲
re.S (DOTALL):點任意匹配模式,改變'.'的行爲
re.L (LOCALE):使用預定字符類 \w \W \b \B \s \S取決於當前區域設定
re.U (UNICODE): 使預定字符類 \w \W \b \B \s \S \d \D 取決於unicode定義的字符屬性
re.X (VERBOSE): 詳細模式。這個模式下正則表達式可以是多行,忽略空白字符,並可以加入註釋。
2、re.findall(pattern,string[,flags]):以列表的形式返回能匹配的子串
>>>p = re.compile(r'\d')
>>>p.findall('whx520hhh41')
['5', '2', '0', '4', '1']
3、re.finditer(pattern,string[,flags]):返回一個順序訪問每一個匹配結果(Match對象)的迭代器
>>>p = re.compile(r'\d+')
>>>for m in p.finditer('theonly123one555h1'):
print(m.group())
123
555
1
4、re.match():從起點開始做匹配,匹配到返回match對象,否則返回None
>>>p = re.compile(r'\d+')
>>>m = p.match('www1123')
>>>m
None
>>>m = p.match('1www1123')
>>>m
<_sre.SRE_Match object; span=(0, 1), match='1'>
re.match對象所具有的方法
group():獲得一個或者多個分組匹配的字符串,當獲得整個匹配的子串時,直接使用group或者group(0)
star()t:獲取分組匹配的子串在整個字符串中的開始位置,參數默認爲0
end():獲取分組匹配的子串在整個字符串中的結束位置,參數默認爲0
span():返回的結構技術(start(group),end(group))
5、re.search():掃描整個字符串返回第一個匹配到的元素並結束,匹配不到返回None
>>>p = re.compile(r'\d')
>>>m = p.search('aaaad2xxxx333')
>>>m
<_sre.SRE_Match object; span=(5, 6), match='2'>
6、re.sub和re.subn:替換匹配成功的字串,sub不僅僅可以是字符串,也可以是函數。subn函數返回元組。
>>>p = re.compile(r'\d+')
>>>ret = p.sub('*','ab12cd34ef56')
>>>ret
'ab*cd*ef*'
>>>ret = p.subn('*','ab12cd34ef56')
>>>ret
('ab*cd*ef*', 3)
7、re.split(pattern.string,maxsplit=0):通過正則表達式將字符串分離。如果用括號將正則表達式括起來,那麼匹配的字符串也會被列入到list中返回。maxsplit是分離的次數,maxsplit=1分離一次,默認爲0,不限制次數。
>>>p = re.compile(r'\d+')
>>>sp = p.split('a1b2c3d4ef56g8')
>>>sp
['a', 'b', 'c', 'd', 'ef', 'g', '']
其他:
控制貪心:
•*? 重複任意次,但儘可能少重複
•+? 重複1次或更多次,但儘可能少重複
•?? 重複0次或1次,但儘可能少重複
•{n,}? 重複n次以上,但儘可能少重複
小案例:
手機號,電話號:
手機號碼傻瓜版: ^1\d{10}$
電話號碼必備區號版:\d{3}-\d{8}|\d{4}-\d{7}匹配形式如 0511-4405222 或 021-87888822
郵箱:
電子郵件的驗證:/(\w+@(\w+\.)+\w{2,3})?/
驗證Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\. \w+([-.]\w+)*$
驗證Email地址:/.+@.+\.[a-z]+/
身份證:
身份證號: ^(\d{15}|\d{17}(\d|X))$
-匹配騰訊QQ號:[1-9][0-9]{4,}騰訊QQ號從10000開始
-只能輸入漢字:^[\u4e00-\u9fa5]{1,8}$
-只能輸入由數字和26個英文字母組成的字符串:“^[A-Za-z0-9]+ $”
-驗證用戶密碼:“^[a-zA-Z]\w{7,17}$”正確格式爲:以字母開頭,長度在8-18之間, 只能包含字符、數字和下劃線。