Python正則表達式模塊re
阿新 • • 發佈:2017-10-07
身份證號碼 cas 返回 eight pri 經典 增加 為什麽 有用
介紹
正則表達式是用來簡介表達一組字符串的表達式,是一種通用的字符串表達框架。
正則表達式是一種正對字符串表達“簡潔”和“特征”思想的工具,正則表達式可以用來判斷某字符串的特征歸屬。
正則表達式在在文本處理中十分常用:
- 表達文本類型的特征(病毒、入侵等)
- 同時查找或替換一組字符串
- 匹配字符串的全部或部分(最主要是應用到字符串匹配中)
- 。。。。。。
使用
1.將符合正則表達式語法的字符串轉換成正則表達式特征
>>> regex = ‘P(Y|YT|YTH|YTHO)?N’ >>> p = re.compile(regex)
2.正則表達式常用操作符
操作符 | 說明 | 實例 |
. | 表示任何單個字符 | |
[] | 字符集,對單個字符給出排除範圍 | [abc] 表示 a、b、c,[a-z]表示a到z單個字符 |
[^ ] | 非字符集,對單個字符給出排除範圍 | [^abc] 表示 非a或b或c的單個字符 |
* |
前一個字符0次或無限次擴展 |
abc* 表示 ab、abc、abcc、abccc等 |
+ | 前一個字符1次或無限次擴展 |
abc+ 表示 abc、abcc、abccc等 |
? | 前一個字符0次或1次擴展 | abc? 表示 ab、abc |
| | 左右表達式任意一個 | abc|def 表示abc、def |
{m} | 擴展前一個字符m次 | ab{2} 表示 abbc |
{m,n} | 擴展前一個字符m至n次(含n) | ab{1,2}c 表示 abc、abbc |
^ | 匹配字符串開頭 | ^abc 表示 abc且在一個字符串的開頭 |
$ | 匹配字符串的結尾 | abc$ 表示 abc且在一個字符串的結尾 |
\d | 數字,等價[0-9] | |
\w |
單詞字符,等價於[A-Za-z0-9] |
|
( ) | 分組標記,內部只能使用 | 操作符 | (abc) 表示abc,(abc|def) 表示 abc,def |
‘(?P...)‘ 分組匹配 re.search("(?P[0-9]{4})(?P[0-9]{2})(?P[0-9]{4})","371481199306143242").groupdict("city") 結果{‘province‘: ‘3714‘, ‘city‘: ‘81‘, ‘birthday‘: ‘1993‘}
3.最小匹配操作符
操作符 | 說明 |
*? | 前一個字符0次或無限次擴展,最小匹配 |
+? | 前一個字符1次或無限次擴展,最小匹配 |
?? | 前一個字符0次或1次擴展,最小匹配 |
{m,n}? | 擴展前一個字符m至n次(含n),最小匹配 |
只要長度輸出可能不同的,都可以在操作符後增加?變成最小匹配
4.re的匹配函數
re.search(pattern, string, flags=0) //在一個字符串中搜索匹配正則表達式的第一位置,返回match對象 pattern:正則表達式的字符串或原生字符串表示 string:待匹配字符串 flags:正則表達式使用時的控制標記 re.match(pattern, string, flages=0) //從一個字符串串起始位置起匹配正則表達式,返回match對象 re.findall(pattern, string, flags=0) //搜索字符串,以列表類型返回全部能匹配的子串 re.split(pattern, string, maxsplit=0, flags=0) //將一個字符串按照正則表達式匹配結果進行分割,返回列表類型 maxsplit:最大分割數,剩余部分最為最後一個元素輸出 re.finditer(pattern, string, flags=0) //搜索字符串,返回一個匹配結果的叠代類型,每個叠代元素是match對象 re.sub(pattern, repl, string, count=0, flags=0) //在一個字符串中替換所有匹配正則表達式的子串,返回替換後的字符串 repl:替換匹配字符串的字符串 count:匹配的最大替換次數
5.常用標記
re.I re.IGNORECASE //忽略正則表達式的大小寫,[A-Z]能匹配小寫字符; re.M re.MULTILINE //正則表達式中的^操作符能夠給定字符串的每行當作匹配開始; re.S re.DOTALL //正則表達式中的.操作符能夠匹配所有字符,默認匹配除換行外的所有字符;
5.Match對象
Match對象是一次匹配的結果,包含匹配的很多信息
>>> import re >>> match = re.search(r‘[1-9]\d{5}‘, ‘BIT 100081‘) >>> if match: print(match.group(0)) 100081 >>> type(match) <type ‘_sre.SRE_Match‘>
Match對象的屬性:
.string //待匹配的文本; .re //匹配時使用的patter對象(正則表達式); .pos //正則表達式搜索文本的開始位置; .endpos //正則表達式搜索文本的結束位置;
Match對象的方法:
.group(0) //獲得匹配後的字符串; .start() //匹配字符串在原始字符串的開始位置; .end() //匹配字符串在原始字符串的結束位置; .span() //返回(.start(), .end());
-------------------------------------------------------------------------------------->
>>> import re >>> m = re.search(r‘[1-9]\d{5}‘, "BIT100081 TSU10084") >>> m.string ‘BIT100081 TSU10084‘ >>> m.pos 0 >>> m.endpos 18 >>> m.re <_sre.SRE_Pattern object at 0x03483448> >>> m.group(0) ‘100081‘ >>> m.start() 3 >>> m.end() 9 >>> m.span() (3, 9)
7.R庫的另一種等級方法
>>> rst = re.search(r‘ [1-9]\d{5}‘, ‘BIT 10981) #函數式用法:一次性操作 ︿ 等||等 價||價 ﹀ >>> pat = re.compile(r [1-9]\d{5} ) #面向對象用法: 編譯後的多次操作 >>> rst = pat.search( BIT 10008 1‘)
8.經典正則表達式實例
^[A- za- z] +$ //由26個字母組成的字符串 ^[A- Za- z0- 9] +$ //由26個字母和數字組成的字符串 ^-?\d+$ //整數形式的字符串 ^[o-9]*[1-9][e-9]*$ //正整數形式的字符串 [1-9]\d{5} //中國境內郵政編碼,6位 [\u4e00-\u9fa5 ] //匹配中文字符 \d{3}-\d{8}\d{4}-\d{7} //國內電話號碼,010-68913536
匹配IP地址的正則表達式
IP地址字符串形式的正則表達式(IP地址分4段,每段8-255 ) \d+.\d+.\d+.\d+ 或\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} 精確寫法 0-99 : [1-9]?\d; 100-199 : 1\d{2}; 200- 249 : 2[0-4]\d; 250-255 : 25[0-5]; (([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])
9.最全的常用正則表達式大全——包括校驗數字、字符、一些特殊的需求等等
作者:zxin,出處:博客園:http://zxin.cnblogs.com/
鏈接:http://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html
一、校驗數字的表達式
數字:^[0-9]*$ n位的數字:^\d{n}$ 至少n位的數字:^\d{n,}$ m-n位的數字:^\d{m,n}$ 零和非零開頭的數字:^(0|[1-9][0-9]*)$ 非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 帶1-2位小數的正數或負數:^(\-)?\d+(\.\d{1,2})?$ 正數、負數、和小數:^(\-|\+)?\d+(\.\d+)?$ 有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$ 有1~3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$ 非零的正整數:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$ 非零的負整數:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$ 非負整數:^\d+$ 或 ^[1-9]\d*|0$ 非正整數:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$ 非負浮點數:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ 非正浮點數:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ 正浮點數:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ 負浮點數:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ 浮點數:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
二、校驗字符的表達式
漢字:^[\u4e00-\u9fa5]{0,}$ 英文和數字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$ 長度為3-20的所有字符:^.{3,20}$ 由26個英文字母組成的字符串:^[A-Za-z]+$ 由26個大寫英文字母組成的字符串:^[A-Z]+$ 由26個小寫英文字母組成的字符串:^[a-z]+$ 由數字和26個英文字母組成的字符串:^[A-Za-z0-9]+$ 由數字、26個英文字母或者下劃線組成的字符串:^\w+$ 或 ^\w{3,20}$ 中文、英文、數字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$ 中文、英文、數字但不包括下劃線等符號:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$ 可以輸入含有^%&‘,;=?$\"等字符:[^%&‘,;=?$\x22]+ 禁止輸入含有~的字符:[^~\x22]+
三、特殊需求表達式
Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ 手機號碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ 電話號碼("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$ 國內電話號碼(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7} 身份證號(15位、18位數字):^\d{15}|\d{18}$ 短身份證號碼(數字、字母x結尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$ 帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]\w{5,17}$ 強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 日期格式:^\d{4}-\d{1,2}-\d{1,2} 一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$ 一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$ 錢的輸入格式: 1).有四種錢的表示形式我們可以接受:"10000.00" 和 "10,000.00", 和沒有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$ 2).這表示任意一個不以0開頭的數字,但是,這也意味著一個字符"0"不通過,所以我們采用下面的形式:^(0|[1-9][0-9]*)$ 3).一個0或者一個不以0開頭的數字.我們還可以允許開頭有一個負號:^(0|-?[1-9][0-9]*)$ 4).這表示一個0或者一個可能為負的開頭不為0的數字.讓用戶以0開頭好了.把負號的也去掉,因為錢總不能是負的吧.下面我們要加的是說明可能的小數部分:^[0-9]+(.[0-9]+)?$ 5).必須說明的是,小數點後面至少應該有1位數,所以"10."是不通過的,但是 "10" 和 "10.2" 是通過的:^[0-9]+(.[0-9]{2})?$ 6).這樣我們規定小數點後面必須有兩位,如果你認為太苛刻了,可以這樣:^[0-9]+(.[0-9]{1,2})?$ 7).這樣就允許用戶只寫一位小數.下面我們該考慮數字中的逗號了,我們可以這樣:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ 8). 1到3個數字,後面跟著任意個 逗號+3個數字,逗號成為可選,而不是必須:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$ 備註:這就是最終結果了,別忘了"+"可以用"*"替代如果你覺得空字符串也可以接受的話(奇怪,為什麽?)最後,別忘了在用函數時去掉去掉那個反斜杠,一般的錯誤都在這裏25 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$ 中文字符的正則表達式:[\u4e00-\u9fa5] 雙字節字符:[^\x00-\xff] (包括漢字在內,可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)) 空白行的正則表達式:\n\s*\r (可以用來刪除空白行) HTML標記的正則表達式:<(\S*?)[^>]*>.*?|<.*? /> (網上流傳的版本太糟糕,上面這個也僅僅能部分,對於復雜的嵌套標記依舊無能為力) 首尾空白字符的正則表達式:^\s*|\s*$或(^\s*)|(\s*$) (可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式) 騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始) 中國郵政編碼:[1-9]\d{5}(?!\d) (中國郵政編碼為6位數字) IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址時有用) P地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)) (由@飛龍三少 提供,感謝共享)
Python正則表達式模塊re