目錄
一、打開正則表達式
?二、正則表達式的使用
1、限定符
(1)x*:*表示它前面的字符y 可以有0個或多個;
?(2)x+:表示它前面的字符可以出現一次以上;(+只可以匹配多次)
(3)x{}:精確指定一個字符x出現了多少次;
(4)x{2,5}:指定字符出現次數的范圍,x{2,} :字符x出現2次以上;
(5)x?:字符x出現0次或1次;
2、運算符
(1)(x|y):匹配字符x或y。(xy)|(ab):匹配 xy 或ab;
3、字符類
4、元字符
5、貪婪匹配和懶惰匹配
三、正則表達式實際應用-Python實現
1、re.finadll 用法
2、re.search 用法
3、.group 用法
4、re.finditer 用法
5、re.match 和?re.fullmatch?用法
6、re.sub 和 re.subn 用法
7、re.split 用法
8、re.compile 用法
9、正則表達式實際運用
(1)匹配手機號
(2)將字符串轉成字典格式
一、打開正則表達式
1、快捷鍵 Ctrl+R,將替換功能調出來且圖中紅框的位置一定要點亮,才可以使用正則表達式;
?二、正則表達式的使用
1、限定符
(1)x*:*表示它前面的字符y 可以有0個或多個;
?(2)x+:表示它前面的字符可以出現一次以上;(+只可以匹配多次)
(3)x{}:精確指定一個字符x出現了多少次;
(4)x{2,5}:指定字符出現次數的范圍,x{2,} :字符x出現2次以上;
(5)x?:字符x出現0次或1次;
2、運算符
(1)(x|y):匹配字符x或y。(xy)|(ab):匹配 xy 或ab;
3、字符類
[abc]+:表示匹配的字符只能取自abc
[a-z]表示所有的小寫字母
[a-zA-Z]表示所有的英文字母
[a-zA-Z0-9]表示所有的英文字母和數字
[^a-zA-Z0-9]表示匹配除了尖號后面列出的所有字符之外的符號
4、元字符
正則里面的元字符基本上是以反斜杠開頭的;
5、貪婪匹配和懶惰匹配
<.+>:貪婪匹配任意字符,不包括換行符
<.+?>:懶惰匹配任意字符
三、正則表達式實際應用-Python實現
注:需要用到 re 模塊
1、re.finadll 用法
re.findall('.+', 'abc\ndef\nghi\n') # 第一個參數是正則表達式,第二個參數是需要匹配的字符串 運行結果:['abc', 'def', 'ghi']
print(re.findall('.+', 'abc\ndef\nghi\n',flags=re.DOTALL)) # flags=re.DOTALL表示匹配所有的字符 運行結果:['abc\ndef\nghi\n']
查閱官方資料:
1)瀏覽器搜索 Python re flags;
2)找到官網并點擊;
2、re.search 用法
# 用法與findall一樣,唯一不同的是返回值;它只會匹配符合規則的第一個值,且返回的是一個Match對象。如果匹配不到,則返回NOne;
print(re.search('\d{3,4}', 'Tel-028-7654321'))
print(re.search('[a-z]{4,5}', 'Tel-028-7654321'))
運行結果:
<re.Match object; span=(4, 7), match='028'>
None
3、.group 用法
res = re.search('(\d{3,4})-(\d{7,8})', 'Tel-028-7654321')print(res.group()) print(res.group(1)) print(res.group(2))
運行結果:
028-7654321
028
7654321
4、re.finditer 用法
功能:匹配所有符合規則的內容,并處理成迭代器返回;
res = re.finditer('(\d{3,4})-(\d{7,8})', 'Tel-028-7654321 Tel-059-0123467')
print(res)
for m in res:print(m.group())# print(m.group(1))# print(m.group(2))
運行結果:
<callable_iterator object at 0x0000021E7D812E60>
(1)group無參數:
028-7654321
059-0123467(2)group參數為1:
028
059(3)group參數為2:
7654321
0123467
?補充:
# 迭代器,不依賴于索引的迭代取值方式
迭代就是重復,每一次的重復都是在上一次的基礎上
?詳細請讀python-迭代器
5、re.match 和?re.fullmatch?用法
re.match與re.seach用法一樣,也是只匹配符合規則的第一個值,并返回Match對象。
但它只能匹配字符串的開頭,若匹配不到返回None;
re.fullmatch ,從頭匹配到尾,也就是進行匹配整個字符串,若成功返回Match對象,否則返回None;
6、re.sub 和 re.subn 用法
re.sub功能:將匹配到的內容替換成其他內容;可以穿字符串,函數地址
(1)傳字符串
res = re.finditer('(\d{3,4})-(\d{7,8})', 'Tel-028-7654321 Tel-059-0123467') for m in res:print(m.group()) print(re.sub('(\d{3,4})-(\d{7,8})', '***', 'Tel-028-7654321 Tel-059-0123467'))y
運行結果:
028-7654321
059-0123467
Tel-*** Tel-***
(2)傳內存地址 - sub功能每匹配到一個值,就會得到一個Match對象,然后調用我們傳的函數,并把Match對象傳給他。
脫敏后的電話號碼---運于外賣上
def des(m): # 這里是為了sub調用函數,傳對象給函數,這里m接收Match對象print(f'group(1):',m.group(1))tel = m.group(2)print(f'group(2):',tel)return tel[:2] + '***' + tel[-2:] # tel[:2]得到tel的前兩位,tel[-2:]得到后兩位print(re.sub('(\d{3,4})-(\d{7,8})', des, 'Tel-028-7654321 Tel-059-0123467'))
運行結果:
group(1): 028
group(2): 7654321
group(1): 059
group(2): 0123467
Tel-76***21 Tel-01***67
re.subn功能與re.sub一樣,多返回了一個替換的次數
上面的例子
def des(m):tel = m.group(2)return tel[:2] + '***' + tel[-2:]print(re.subn('(\d{3,4})-(\d{7,8})', des, 'Tel-028-7654321 Tel-059-0123467'))
運行結果;
('Tel-76***21 Tel-01***67', 2)
7、re.split 用法
作用:把正則匹配到的內容作為分隔符進行拆分
s = 'xyg,- time, !dog, cat'
# 傳統的拆分
print(f'傳統拆分:', s.split(','))print(re.split('\w', s)) # \w 匹配單詞字符(包括字母、數字和下劃線)
print(re.split('\W', s)) # \W 匹配非單詞字符
print(re.split('\W+', s)) # \W+ 加上+ 表示只匹配的字符只能取自W
運行結果:
傳統拆分: ['xyg', '- time', ' ?!dog', ' ?cat']
['', '', '', ',- ', '', '', '', ', ?!', '', '', ', ?', '', '', '']
['xyg', '', '', 'time', '', '', '', 'dog', '', '', 'cat']
['xyg', 'time', 'dog', 'cat']
8、re.compile 用法
功能:傳給它一個正則表達式,它會返回一個正則表達式對象;主要用于一個正則表達式被多次使用時。
res = re.compile('.*') print(res.findall('Tel-028-7654321 Tel-059-0123467'))
運行結果:
['Tel-028-7654321 Tel-059-0123467', '']
9、正則表達式實際運用
(1)匹配手機號
phone_num = '''
125163251489
15812569487
15536854456
15587452256
15520361197
ab153023697
141111111111
12348567954
136489651035
13845620147
163258953255551'''print(re.findall(r'\b(13[0-9]|14[5-9]|15[0-35-9])\d{8}\b', phone_num))
print(re.findall(r'\b(?:13[0-9]|14[5-9]|15[0-35-9])\d{8}\b', phone_num))# 加r:防止轉義# \b 標注字符的邊界
# \d 匹配數字字符
# x{y} x字符出現y次
# x{a,b} 指定字符出現次數的范圍
# 在編程語言中使用正則,如果正則表達式中出現小括號,那編程語言會把小括號視作匹配邊界;也就是說會把小括號里面的內容視為一個group
# 解決方法:在小括號內的最前面加上?:,這樣可以申明這個小括號不是一個group
運行結果:
['158', '155', '155', '155', '138']
['15812569487', '15536854456', '15587452256', '15520361197', '13845620147']
(2)將字符串轉成字典格式
思想:
第一組:group(1)
第二組:group(2)
s = '''
Host: movie.douban.com
Pragma: no-cache
Referer: https://cn.bing.com/
'''
dic = {}
res = re.finditer('(.*): (.*)', s)
# .*:*表示它前面字符.可以有0個或多個
# : 冒號后面加空格,會因為字符串s中,冒號后面有空格for m in res: # res寫了兩個小括號,就是兩組小括號# print(m.group(1))# print(m.group(2))dic[m.group(1)] = m.group(2) # 填充到字典中print(dic)
運行結果:
{'Host': 'movie.douban.com', 'Pragma': 'no-cache', 'Referer': 'https://cn.bing.com/'}