做網站設計參考文獻寧德市人社局
正則表達式基礎
一、初識正則表達式
思考–問題答案在文末
- 問題1:text1 = ‘height:178,weight:168,sid:123456,passwd:9527’,如何快速找出密碼?
- 問題2:text2 = ‘他的電話是18812345678x,他的生日是20000908,他愛好的數字是01234567891,他的座機是:0571-52152166’,如何快速匹配座機?
- 問題3:text3 = ‘1234567@qq.com’ ,如何檢測郵箱格式是否正確?
Q1:什么是正則表達式?
正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯。
Q2:他有什么用處?
- 判斷給定的字符串是否符合正則表達式的過濾邏輯(驗證):(驗證:登錄信息、手機號、郵箱地址)
- 可以通過正則表達式,從字符串中獲取我們想要的特定部分(匹配)
常見匹配字符
符號 | 描述 |
---|---|
. | 匹配處換行符\n之外任意1個字符 |
[] | 匹配[]中任意一個 |
\d | 一個0-9數字 |
\D | 匹配非數字 |
\w | 匹配單詞字符:a-z、A-Z、0-9 |
\W | 匹配非單詞字符 |
\s | 匹配空格、tab健 |
\S | 匹配非空格,tab健 |
常用的匹配規(guī)則-匹配字符數量
-
匹配前一個字符出現0次或者無數次
-
匹配前一個字符出現1次或者無數次
符號 | 描述 |
---|---|
? | 匹配前一個字符出現0次或者1次 |
{m} | 匹配前一個字符出現m次 |
{m,} | 匹配前一個字符出現至少m次 |
{n,m} | 匹配前一個字符出現n-m次 |
^ | 匹配字符串開頭 |
$ | 匹配字符串結尾 |
| | 或 |
(ab) | 將括號中字符作為一個分組 |
二、 python正則表達式處理模塊----re
2.1re.match函數----對字符串進行匹配
#re.match()函數,可以對字符進行匹配,查找的位置是從指定的位置開始一直往后找,返回第一個符合規(guī)則的對象,如果開始位置不符合匹配隊形則返回None。而如果從起始位置開始沒有匹配成功,即便其他部分包含需要匹配的內容,re.match()也會返回None。
import re
#基本的語法格式:match(pattern,string,flags=0)
#其中第一個參數是需要進行匹配的內容,第二個參數表示的是一個匹配的字符串,最后一個參數這是一個控制正則表達式的匹配方式,是一個可選的參數,
s1 = 'height:178 weight:168,sid:123456,passwd:9527'
re2 = re.match('[a-zA-Z]+\W\d+\s\w+',s1)
print(re2)s = "python is the bset language"
re1 = re.match('(.*)\s(\w+)\s(\w+)(\s\w+)(\s\w+)',s)
print(re1)
print(re1.group())
print(re1.group(1))
print(re1.group(2))
print(re1.group(3))
print(re1.span())*******************print*********************************
<re.Match object; span=(0, 17), match='height:178 weight'>
<re.Match object; span=(0, 27), match='python is the bset language'>
python is the bset language
python
is
the
(0, 27)
2.2 re.findall()
findall匹配所有返回一個列表,這個方法使用頻率較高。
import re
text = 'height:178,weight:168,sid:123456,passwd:9527'
print(re.findall(r'[a-zA-Z]+',text))
text2 = '12232443@qq.com'
print(re.findall(r'\d{6,10}@qq.com',text2))
text3 = 'syyang2022@163.com'
print(re.findall(r'\w+@\w+.\w{2,3}$',text3))
#print(re.findall(r'^[a-zA-Z-_]+@[a-zA-Z-_]+.[a-zA-Z-_]+',text3))
text4 = '10.10.10.10'
print(re.findall(r'\d{1,3}.\d+.\d+.\d+',text4))
#print(re.findall('\D+',text))*******************print*********************************
['height', 'weight', 'sid', 'passwd']
['12232443@qq.com']
['syyang2022@163.com']
['10.10.10.10']
2.3 re.search方法
re.search 掃描整個字符串并返回第一個成功的匹配。search 在全文中匹配一次,匹配到就返回 函數語法: re.search(pattern, string, flags=0) 示例: 輸出結果: searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter
import re
s = "Cats are smarter than dogs"
re2 = re.search('are',s)
print(re2)
print(re2.group())*******************print*********************************
<re.Match object; span=(5, 8), match='are'>
are
2.4 re.sub()
檢索和替換 re.sub()將匹配到的數據進行替換。 語法:re.sub(pattern, repl, string, count=0, flags=0) 示例: 輸出結果: 電話號碼是: 2019-0101-000 電話號碼是 : 20190101000
import re
s = "python is the bset language"
re2 = re.sub('p','P',s,count=1)
print(re2)s = "2019-0101-000"
re2 = re.sub('-','',s,count=0)
print(re2)*******************print*********************************
Python is the bset language
20190101000
2.5 re.compile
compile 函數用于編譯正則表達式,生成一個正則表達式( Pattern )對象,供其他函數使用,我們常用的正則表達式方法,都已經自帶了compile了。 語法格式為: re.compile(pattern[, flags]) 示例: 輸出結果: None <_sre.SRE_Match object; span=(3, 5), match=‘12’> 12
s1 = 'height:178,weight:168,sid:123456,passwd:9527'
pattern = "\d*"
re2 = re.match(pattern,s1)
print(re2)*******************print*********************************
<re.Match object; span=(0, 0), match=''>
2.6 re.split()
split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下: re.split(pattern, string[, maxsplit=0, flags=0]) 示例: 輸出結果: [‘www’, ‘huawei’, ‘com’]
import re
text = 'www.huawei.com'
print(re.split('w',text,))
print(re.split('\.',text))*******************print*********************************
['', '', '', '.hua', 'ei.com']
['www', 'huawei', 'com']
三、寫正則表達式的步驟
我們仍然以包含分機號碼的座機電話號碼為例,比如0571-88776655-9527,演示下面的步驟:
確定模式包含幾個子模式
它包含3個子模式:0571-88776655-9527。這3個子模式用固定字符連接。
各個部分的字符分類是什么
這3個子模式都是數字類型,可以用\d?,F在可以寫出模式為:
\d-\d-\d
各個子模式如何重復
第1個子模式重復3到4次,因為有010和021等直轄市
第2個子模式重復7到8次,有的地區(qū)只有7位電話號碼
第3個子模式重復3-4次
加上次數限制后,模式成為:
\d{3,4}-\d{7,8}-\d{3,4}
但有的座機沒有分機號,所以我們用或運算符讓它支持兩者:
\d{3,4}-\d{7,8}-\d{3,4}|\d{3,4}-\d{7,8}
是否有外部位置限制
沒有
是否有內部制約關系
沒有
經過一通分析,最后的正則就寫成了,測試一下:
import re
text = '18812345678是他的手機號,他的身份證號是41188123456780978,他愛好的數字是01234567891,他的座機是:0571-52152166'
print(re.findall(r'^1\d{10}|\d{4}-\d{8}', text))*******************print*********************************
['18812345678', '0571-52152166']
掌握常見匹配符合及規(guī)則就夠日常使用
四、4個問題答案
-
問題1:text1 = ‘height:178,weight:168,sid:123456,passwd:9527’,如何快速找出4位數字密碼?
import re text1 = 'height:178,weight:168,sid:123456,passwd:9527' print(re.findall(r'\d{4}$',text1))*******************print********************************* ['9527']
-
問題2:text2 = ‘他的電話是18812345678x,他的生日是20000908,他愛好的數字是01234567891,他的座機是:0571-52152166’,如何快速匹配座機?
import re text2 = '他的電話是18812345678x,他的生日是20000908,他愛好的數字是01234567891,他的座機是:0571-52152166'print(re.findall(r'\d{4}-\d{8}',text2))*******************print********************************* ['0571-52152166']
-
問題3:text3 = ‘1234567@qq.com’ ,如何檢測qq郵箱格式是否正確?
import re text3 = '1234567@qq.com' print(re.findall(r'\d{6,10}@\w+.\w{2,3})',text3))*******************print********************************* ['1234567@qq.com']
日常筆記,共勉