序
今天我們來學習Python的正則表達式,我想接觸過其他語言的朋友一定不陌生,正則表達式并不是python特有的于微,其他語言也有正則表達式唯沮。
正則表達式的官方介紹為:正則表達式,又稱規(guī)則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE)奈嘿,計算機科學的一個概念。正則表達式通常被用來檢索吞加、替換那些符合某個模式(規(guī)則)的文本裙犹。
學習點
在python中使用正則表達式尽狠,需要在文件頭部引入正則表達式的內置對象才能使用
import re
常用的方法為
re.findAll()
例1 匹配數字
import re
a='hdhfdh55df5df49d+'
r=re.findall('\d',a)
print(r)
輸出:['5', '5', '5', '4', '9']
解釋:
方法中的第一個參數 /d 表示只匹配字符串中的數字,第二個參數 a 表示需要操作的字符串變量
想了解更多的正則表達式方法可自行進行百度學習叶圃,這里只進行部分常見的規(guī)則進制學習袄膏。
例2 字符集
#字符集
import re
a='abc,abd,acc,abd,asd'
r=re.findall('a[cb]d',a)
s=re.findall('a[^cb]d',a)
print(r)
print(s)
輸出1:['abd', 'abd']
輸出2:['asd']
解釋:
方法中第一個參數使用了 [cd ] 這個符號,表示只要子子串中出現了其中一個都會匹配上盗似,反之如果是這樣 [^cd ] 符號中加了 ^ 符號則表示子串中只要包含了其中一個字符都不會被匹配上
例3 概括字符集
#概括字符集
import re
#\d 數字 \D 非
#\w 單詞字符 \W 非
# \s 空白字符 \S 非
a='5566dfd5fdg5gs26s0'
r=re.findall('[1-9]',a)
s=re.findall('[^0-9]',a)
f=re.findall('\w',a)
print(r)
print(s)
print(f)
輸出:
['5', '5', '6', '6', '5', '5', '2', '6']
['d', 'f', 'd', 'f', 'd', 'g', 'g', 's', 's']
['5', '5', '6', '6', 'd', 'f', 'd', '5', 'f', 'd', 'g', '5', 'g', 's', '2', '6',
's', '0']
解釋:
[1-9] 表示只匹配數字
[^0-9] 表示匹配除去數字外的字符
\w 表示匹配打個詞的字符
例4:數量詞
#數量詞
import re
a='5566dfd5fdg5gs26s0'
r=re.findall('[a-z]{2,6}',a)
s=re.findall('[a-z]{2,6}?',a)
#貪婪 與 非貪婪
#python 默認貪婪
#非貪婪 后面加問號
print(r)
print(s)
輸出:
['dfd', 'fdg', 'gs']
['df', 'fd', 'gs']
解釋:
[a-z]{2,6} 表示只匹配連續(xù)的2到6個英文字符的子串哩陕,匹配盡可能多的連續(xù)字符 (貪婪的)
[a-z]{2,6}? 表示只匹配連續(xù)的2到6個英文字符的子串,但它是非貪婪的赫舒,所以它匹配的總是匹配最少額連續(xù)字符悍及,總是匹配連續(xù)的2個字符 (非貪婪的)
- Python里數量詞默認是貪婪的(在少數語言里也可能是默認非貪婪),總是嘗試匹配盡可能多的字符接癌;非貪婪則相反心赶,總是嘗試匹配盡可能少的字符
#數量詞
#* 匹配0次或者無限次
#? 匹配0次或者1次
#+ 匹配1次或者無限次
import re
a='pytho5python4pythonn2'
r=re.findall('python?',a)
r2=re.findall('python*',a)
r3=re.findall('python+',a)
print(r)
print(r2)
print(r3)
輸出:
['pytho', 'python', 'python']
['pytho', 'python', 'pythonn']
['python', 'pythonn']
例5 邊界匹配
#邊界匹配
import re
qq='100001'
#4~8
r=re.findall('01$',qq)
print(r)
輸出:
['01']
解釋:
01$ 表示只要字符串最后為 01 則輸出01
例6 組
#組 ()
import re
a='pythonpythonpython222'
r = re.findall('(python){3}',a)
print(r)
輸出:
['python']
解釋:
(python){3} 表示只要字符串有連續(xù)3組 python 字符串 則輸出 python
例7 第三個參數
#第三個參數
import re
a='PythonC#Java'
#.號匹配任何字符包括換行符 \n
r=re.findall('C#.{1}',a,re.I)
# re.I 表示忽略大小寫 re.S 表示改變.號的行為
# r=re.findall('C#.{1}',a,re.I | re.S)
print(r)
輸出:
['C#J']
解釋:
C#.{1} 著重使用 點 字符 匹配后面任何一個字符
re.I 第三個參數就是結合 點號使用的
例8 替換
#替換
import re
a='PythonC#Java'
# 1表示只替換第一個
r = re.sub('C#','GO',a,1)
#內置函數替換
b = a.replace("C#","GO")
print(b)
print(r)
輸出:
PythonGOJava
PythonGOJava
解釋:
re.sub('C#','GO',a,1) 使用字符串 GO 替換 字符串 C# 并且只替換 a 字符串中第一個出現的 C# 子串
例9 使用函數替換操作
# 使用函數替換操作
import re
a ='Abc5566555'
#函數
def show(value):
#打印出來的是一個對象
#print(value)
#獲取集體的值
matched = value.group()
if int(matched) >= 6:
return '9'
else:
return "7"
r = re.sub('65',show,a)
print(r)
輸出:
Abc556955
解釋:
這個邏輯比較難理解缺猛,就是字符串需要替換 65 但65又作為參數傳入 show()函數中缨叫,通過一系列的操作,獲取到 int 類型的65 再與 6 比較 若 65 大于等于 6 則字符串 a 中的65替換為9 反之替換為 7
例10 其他函數匹配
import re
#其他函數匹配
s = 'C55ff55566'
r = re.match('\d',s)
print(r)
#獲取匹配的位置
print(r.span())
r2 = re.search('\d',s)
print(r2)
#獲取值
print(r2.group())
(不知為何荔燎,本地未成功輸出)
注:與 findAll() 不同之處為他們都只匹配一次
例11 較復雜組() 匹配
import re
s = 'int sdf= dfd d, python , i love java'
#使用組匹配 () ,可以多個組
r = re.findall('int(.*)python(.*)java',s)
print(r.group(1,2))
#獲取全部組
print(r.groups())
(不知為何耻姥,本地未成功輸出)
- 一共剛好 11 個例子 ,今天剛好 11.11