正則
什麼是正則?
正則就是表達式,用於數據的提取。
re模塊的簡單使用
從左到右進行匹配,apple的每一個字母都可以匹配上
即使後面再寫很多的東西
也可以匹配上apple,後面的匹配不上就不管了
從左到右進行匹配,第一個字母都匹配不上,所以就不會再往下進行匹配
import re
pattert = re.compile('apple')#規則
result = pattert.match('apple17189208888')#裏面寫很多東西,然後規則來匹配
print(result)
##直接寫
result = re.match('apple','apple171788')
#第一個參數表示規則,要匹配的東西
#第二個是規則要去匹配的語句
print(result)
第一個寫的好處是,一套規則可以多處使用
第二個便潔
正則之代表字符
.表示可以匹配任意字符(除了\n)
可以看到只匹配了一個a,(因爲從左到右匹配)
如果想全部打印出來的話
就可以寫5個點,可以看到返回了apple
如果直接想看到結果,不想看到這些東西,可以使用group
group表示可以直接取到匹配的值,但是要做判斷。
可以看到返回的只有apple
但是如果匹配不到值的話,是會報錯的
在apple裏面找1,肯定是找不到的,這個時候用ggroup,是會報錯的,所以最好先判斷一下
import re
result = re.match('1','apple')
if result:#如果有返回值的話,再去打印
print(result)
.匹配不上\n(\n表示換行)
result = re.match('.','\n')
print(result)
顯示的結果是
直接返回的none,如果想匹配\n的話
直接寫上\n規則就好
匹配小數(\轉義)
小數點在正則裏面是有意義的,所以想要匹配小數,就得用轉義,告訴他,這就是一個小數點
\表示轉義,在小數點前面加上\就歐克了
[]表示匹配其中的任意一個字符
[]不管有多少字符,就只能匹配其中的一個
可以看到返回的結果只有一個1
[]中的.只是一個普通的.,沒有任何的意義
[a-z]表示匹配從a到z的 任意一個 字符
[a-z0-9]表示匹配 從a到z或者從0到9的 任意一個 字符
[a-z0-9-]表示匹配從a到z 或者從0到9 或者- 的任意一個字符
[a-z]表示匹配 a - z這三個字符當中的任意一個
** 因爲\可以轉義 ,加上它之後-就沒有了意義**
[[]]表示要匹配 [ ] 中的任意一個
在[]裏面的^表示取反的意思,它本身代表以什麼開頭,如下例子
import re
result = re.match('[^5]','5')
#前面的規則是除了5 後面就只有一個5
print(result)
結果
可以看到5是匹配不上的,除了5,任意的一個字符都可以匹配上
re裏面的\d(可以匹配一位數字) \D(匹配非數字,一個\D能匹配一個)
因爲\d表示匹配一位數字,\d\d這個規則表示要匹配兩位數字,但是後面的句子中只有一位數字,所以返回none
\D表示匹配任意一個不是數字的字符,比如
\D匹配的數量也是一個 匹配的是非數字
re裏面的\s(匹配一個空格和Tab鍵) \S(匹配非空白,匹配數量也是一個)
re.match('愛\s情','愛 情')表示匹配愛 情
\S只要不是空格就行
re裏面的w和W
w匹配非特殊字符,比如a-z、0-9、漢字、_
W匹配特殊字符,比如非字母、非數字、非漢字、非_,它可以支持空格、表情等
原始字符串
r可以消除特殊字符的意義
import re
s = '呵\n呵'
result = re.match(r'呵\n呵',s)
print(result)
結果
\n是換行符,但是前面加上r就沒用意義了
再比如
import re
result = re.match(r'.','...')
print(result)
結果
.在正則裏面表示匹配除了\n之外的任意一個字符,但是前面加上r之後,.就沒有了意義
r的原理
*r就相當於在有意義的字符前面加了反義字符*
正則之代表數量
*代表 0次 或者 無數次
import re
result = re.match('\d*','a')
print(result)
雖然\d是匹配數字的,但是*代表0或者無數,所以運行結果不會返回none
匹配的到是一個’'空字符串
+表示 1次 或者 無數次
?表示 0次 或者 1次
import re
result = re.match('\d?','123456')
print(result)
結果只能匹配到1
?表示0和1次,所以
import re
result = re.match('\d?','a')
print(result)
運行結果也是和*一樣的
{n}表示 n次
import re
result = re.match('\d{9}','1234')
print(result)
運行結果
因爲最少要出現9個數字,後面的數字不足9個,所以匹配不上
{n,}表示 最少n次
{n,m}表示 n到m次,注意包括n和m
小練習:匹配一個手機號
import re
result=re.match('1[3456]\d{9}','138357510698756')
print(result)
運行結果