# 第三週學習開始啦啦啦啦
# 正則表達式由 字符和操作符 組成
****************************** 基本常用的正則表達式操作符 ****************************
. 表示任何單個字符
[] 字符集,對單個字符給出取值範圍 例:[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且在一個字符串的開頭
$ 匹配字符串結尾 例:^abc表示abc且在一個字符串的結尾
() 分組標記,內部只能使用|操作 例:(abc)表示abc,(abc|def)表示abc、def
\d 數字,等價於[0-9]
\w 單詞字符,等價於[A-Za-z0-9_]
!!!當正則表達式包含<轉義符>時,使用raw string
*********************************** re庫的基本操作 ***********************************
1、re.search(pattern, string, flags=0)
在一個字符串中搜索匹配正則表達式的第一個位置,返回match對象。
pattern:正則表達式的字符串或原生字符串表示
string:帶匹配字符串
flags:正則表達式使用時的控制標記
re.I(re.IGNORECASE):忽略正則表達式的大小寫,[A-Z]能夠匹配小寫字母
re.M(re.MULTILINE):正則表達式中的^操作能夠將給定的字符串的每一行都當作匹配開始
re.S(re.DOTALL):正則表達式中的.操作符能夠匹配所有字符,默認匹配除換行外的所有字符
例:
import re
match = re.search(r'[1-9]\d{5}', 'BIT 100081')
print(match.group(0))
運行結果:100081
2、re.match(pattern, string, flags=0)
從一個字符串的開始位置起匹配正則表達式,返回match對象。其他如上。
例:
import re
match = re.match(r'[1-9]\d{5}', '100081 BIT')
if match:
print(match.group(0))
運行結果:100081
3、re.findall(pattern, string, flags=0)
搜索字符串,以列表類型返回全部能匹配的子串。其他如上。
例:
import re
match = re.findall(r'[1-9]\d{5}', 'BIT 110002 3521812')
if match:
print(match)
運行結果:['110002', '352181']
4、re.split(pattern, string, maxsplit=0, flags=0)
將一個字符串按照正則表達式匹配結果進行分割,返回列表類型。
maxsplit:最大分割數,剩餘部分作爲最後一個元素輸出
例:
import re
match = re.split(r'[1-9]\d{5}', 'BIT 1100020BAT3521812')
if match:
print(match)
運行結果:['BIT ', '0BAT', '2']
import re
match = re.split(r'[1-9]\d{5}', 'BIT 1100020 BAT3521812',maxsplit=1)
rint(match)
運行結果:['BIT ', '0BAT3521812']
5、re.finditer(pattern, string, flags=0)
搜索字符串,返回一個匹配結果的迭代類型,每個迭代元素是match對象。
例:
import re
for m in re.finditer(r'[1-9]\d{5}', 'BIT 1100020 BAT3521812'):
print(m.group(0))
運行結果:110002
352181
6、re.sub(pattern, repl, string, count=0, flags=0)
在一個字符串中替代所有匹配正則表達式的子串,返回替代後的字符串。
reql:替換匹配字符串的字符串
count:匹配的最大替換次數
例:
import re
m = re.sub(r'[1-9]\d{5}','哈哈哈', 'BIT 110002 BAT3521812')
print(m)
運行結果:BIT 哈哈哈 BAT哈哈哈2
********************************* re庫的另一種等價用法 *********************************
函數式用法:一次性操作
>>> rst = re.search(r'[1-9]\d{5}', 'BIT 100081')
面向對象用法:編譯後的多次操作
>>> pat = re.compile(r'[1-9]\d{5}')
>>> rst = pat.search('BIT 100081')
********************************** re庫的 match對象 ***********************************
Match對象的方法:
.group(0):獲得匹配後的字符串
.start():匹配字符串在原始字符串的開始位置
.end():匹配字符串在原始字符串的結束位置
.span():返回(.start, .end())
Match對象的屬性:
.string:帶匹配的文本
.re:匹配時使用的pattern對象(正則表達式)
.pos:正則表達式搜索文本的開始位置
.endpos:正則表達式搜索文本的結束位置
注意:match對象只返回一次匹配對象
********************************** re庫的貪婪匹配 ***********************************
Re庫默認採用貪婪匹配,即輸出匹配最長的字符串
例:
import re
match = re.search(r'PY.*N', 'PYANBNCNDN')
print(match.group(0))
運行結果:PYANBNCNDN
最小匹配:
*?:前一個字符0次或無限次擴展,最小匹配
+?:前一個字符1次或無限次擴展,最小匹配
??:前一個字符0次或1次擴展,最小匹配
{m,n}?:擴展前一個字符m至n次(含n),最小匹配
例:
import re
match = re.search(r'PY.*?N', 'PYANBNCNDN')
print(match.group(0))
運行結果:PYAN