正則表達式
regular expression regex RE
正則表達式是用來簡潔表達一組字符串的表達式。
'PN'
'PYN'
'PYTN'
'PYTHN'
'PYTHON'
正則表達式:P(Y|YT|YTH|YTHO)?N
'PY'
'PYY'
'PYYY'
.....
'PYYYYYY....'
正則表達式:PY+
'PY'開頭
后續(xù)存在不多于10個字符
后續(xù)字符不能是'P'或'Y'
正則表達式:PY[^PY]{0,10}
- 通用的字符串表達框架
- 簡潔表達一組字符串的表達式
- 針對字符串表達“簡潔”和“特征”思想的工具
- 判斷某字符串的特征歸屬
正則表達式在文本處理中時分常用
- 表達文本類型的特征(病毒、入侵等)
- 同時查找或替換一組字符串
- 匹配字符串的全部或部分
正則表達式的使用
- 編譯:將符合正則表達式語法的字符串轉(zhuǎn)換成正則表達式特征。
正則表達式的語法
正則表達式的常用操作符
| 操作符 | 說明 | 實例 | |
|---|---|---|---|
| . | 表示任何單個字符 | ||
| [] | 字符集,對單個字符給出取值范圍 | [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}c表示abbc | |
| {m,n} | 擴展前一個字符m至n次(含n) | ab{1,2}c表示abc、abbc | |
| ^ | 匹配字符串開頭 | ^abc表示abc且在一個字符串的結(jié)尾 | |
| $ | 匹配字符串結(jié)尾 | abc$表示abc且在一個字符串的結(jié)尾 | |
| () | 分組標記,內(nèi)部職能使用或操作符 | (abc)表示abc,(abc | def)表示abc、def |
| \d | 數(shù)字,等價[0-9] |
經(jīng)典正則表達式實例
^[A-Za-z]+$ 由26個字母組成的字符串
^[A-Za-z0-9]+$ 由26個字母和數(shù)字組成的字符串
^-?\d+$ 整數(shù)形式的字符串
^[0-9][1-0][0-9]$ 正整數(shù)形式的字符串
[1-9]\d{5} 中國境內(nèi)郵政編碼,6位
[\u4e00-\u9fa5] 匹配中文字符
\d{3}-\d{8}|\d{4}-\d{7} 國內(nèi)電話號碼,010-68913536
匹配IP地址的正則表達式
IP地址字符串形式的正則表達式(IP地址分4段,每段0-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])
Re庫的基本使用
Re庫是Python的標準庫,主要用于字符串匹配。
調(diào)用方式:import re
正則表達式的表示類型
- raw string類型(原聲字符串類型)
- string類型,更繁瑣。
re庫采用raw string類型表示正則表達式,表示為:r'text'
例如:
r'[1-9]\d{5}'(raw string)
'[1-9]\d{5}'(string)
raw string 是不包含轉(zhuǎn)義字符的字符串
當正則表達式里有轉(zhuǎn)義字符的時候使用 raw string
Re庫主要功能函數(shù)
| 函數(shù) | 說明 |
|---|---|
| re.search() | 在一個字符串中搜索匹配正則表達式的第一個位置,返回match對象 |
| re.match() | 從一個字符串的開始位置起匹配正則表達式,返回match對象 |
| re.findall() | 搜索字符串,以列表類型返回全部能匹配的子串 |
| re.split() | 將一個字符串按照正則表達式匹配結(jié)果進行分割,返回列表類型 |
| re.finditer() | 搜索字符串,返回一個匹配結(jié)果的迭代類型,每隔迭代元素是match對象 |
| re.sub() | 在一個字符串中替換所有匹配正則表達式的子串,返回替換后的字符串 |
re.search(pattern, string, flag=0)
- 在一個字符串中搜索匹配正則表達式的第一個位置,返回match對象
- pattern:正則表達式的字符串或原生字符串表示
- string:待匹配字符串
- flags:正則表達式使用時的控制標記
| 常用標記 | 說明 |
|---|---|
| re.I re.IGNORECASE | 忽略正則表達式的大小寫,[A-Z]能夠匹配小寫字符 |
| re.M re.MULTILINE | 正則表達式中的^操作符能夠?qū)⒔o定字符串的每行當做匹配開始 |
| re.S re.DOTALL | 正則表達式中的.操作符能夠匹配所有字符,默認匹配除換行外的所有字符 |
Re庫的另一種等價用法
rst = re.search(r'[1-9]\d{5}', 'BIT 100081')
函數(shù)式用法:一次性操作
面向?qū)ο笥梅ǎ壕幾g后的多次操作
pat = re.compile(r'[1-9]\d{5}')
rst = pat.search('BIT 100081')
regex = re.compile(pattern, flags = 0)
- 將正則表達式的字符串形式編譯成正則表達式對象
Match對象的屬性
| 屬性 | 說明 |
|---|---|
| .string | 待匹配的文本 |
| .re | 匹配時使用的pattern對象(正則表達式) |
| .pos | 正則表達式搜索文本的開始位置 |
| .endpos | 正則表達式搜索文本的結(jié)束位置 |
Match對象的方法
| 方法 | 說明 |
|---|---|
| .group(0) | 獲得匹配后的字符串 |
| .start() | 匹配字符串在原始字符串的開始位置 |
| .end() | 匹配字符串在原始字符串的結(jié)束位置 |
| .span() | 返回(.start(), .end()) |
Re庫的貪婪匹配和最小匹配
貪婪匹配
Re庫默認采用貪婪匹配,即輸出匹配最長的字符
match = re.search(r'PY.N', 'PYANBNCNDN')
match.group(0)
'PYANBNCNDN'
最小匹配
match = re.search(r'PY.?N', 'PYANBNCNDN')
match.group(0)
'PYAN'
最小匹配操作符
| 操作符 | 說明 |
|---|---|
| *? | 前一個字符0次或無限次擴展,最小匹配 |
| +? | 前一個字符1次或無限次擴展,最小匹配 |
| ?? | 前一個字符0次或1次擴展,最小匹配 |
| {m,n}? | 擴展前一個字符m至n次(含n),最小匹配 |