一、re.compile 函式
作用:compile 函式用于編譯正則運算式,生成一個正則運算式( Pattern )物件,供 match() 和 search() 這兩個函式使用,
案例:如何判斷是正規的手機號
phone=''' weref234 16888888888 as13423423 weq 435435 15812312312e afa15812312316 13111111111 ''' pattern=re.compile(r'1[3-9]\d{9}') #todo 編譯正則運算式之后得到一個編譯物件 result=pattern.search(phone) #todo search只會回傳第一個匹配的結果,如果沒有匹配成功回傳None print(result) #todo <re.Match object; span=(10, 21), match='15812312312'>
列印結果:
<re.Match object; span=(10, 21), match=‘16888888888’>
16888888888
(10, 21)
??????特別注意
1、result=pattern.search(phone):search匹配成功回傳的是Match物件;search只會回傳第一個匹配的結果,如果沒有匹配成功則回傳None
result.group():回傳第一個匹配結果
result.span():回傳第一個匹配結果的下標,為什么是(10,21)吶?
weref234:從0開始,4結束后還包含了換行符’/n’2個字符,所以從10開始,不包含21,前閉后開的原則
2、result=pattern.search(phone):search匹配成功回傳的是Match物件;search只會回傳第一個匹配的結果,如果沒有匹配成功則回傳None
phone=''' weref234 16888888888 as13423423 weq 435435 15812312312e afa15812312316 13111111111 ''' pattern=re.compile(r'1[3-9]\d{9}') #todo 編譯正則運算式之后得到一個編譯物件 result2=pattern.match(phone) print(result2)
列印結果為None,因為第一個字符為w開頭,所以匹配不到
phone1="17812312345aaa" pattern=re.compile(r'1[3-9]\d{9}') #todo 編譯正則運算式之后得到一個編譯物件 result2=pattern.match(phone1) #todo match函式是從第一個字符開始匹配(從w開始匹配),如果第一個字符不匹配,則回傳None print(result2) print(result2.group()) #todo 回傳第一個匹配結果 print(result2.span()) #todo 回傳第一個匹配結果的下標
列印結果:
<re.Match object; span=(0, 11), match=‘17812312345’>
17812312345
(0, 11)
二、正則運算式
表示字符
.:匹配任意單個字符(不包括換行符)
[]:匹配字符集,區間中的集合,可匹配其中任意一個字符
\d:匹配數字,即0-9,可以表示為[0-9]、
\s:匹配空白字符,即空格
\S:匹配非空白字符,
\w:匹配單詞字符,即a-z、A-Z、0-9、_
\W:匹配非單詞字符
import re #.匹配任意單個字符(不包括換行符) one='123a' res=re.match('.',one) print(res.group()) #[]:匹配字符集,區間中的集合,可匹配其中任意一個字符 two='8' res1=re.match('[0-9]',two) #匹配1-9之間的數字 print(res1.group()) res2=re.match('[0,1,8,9]',two) #匹配0、1、8、9之間的數字 print(res2.group()) two_2='Hello Python' print(re.match('[hH]',two_2).group()) #匹配小寫或大寫H #\d:匹配數字,即0-9,可以表示為[0-9] three='天空1號發射成功' print(re.match('天空\d',three).group()) print(re.search('\d',three).group()) 歡迎加入Python學習交流群:748989764
表示數字
*:匹配前一個字符出現0次或者無限次,即可有可無
+:匹配前一個字符出現1次或者無限次,即至少有1次
?:匹配前一個字符出現1次或者0次,即要么有1次,要么沒有
{m}:匹配前一個字符出現m次
{m,}:匹配前一個字符至少出現m次
{m,n}:匹配前一個字符出現從m到n次
需求1:匹配一個字串第一個字母是大寫,后面的字母必須是小寫或者沒有
print(re.match('[A-Z][a-z]*','Mn').group()) print(re.match('[A-Z][a-z]*','Msdfsg').group()) print(re.match('[A-Z][a-z][a-z]','Msdfs').group())
Mn
Msdfsg
Msd
需求2 匹配一個變數名,
print(re.match(r'[a-zA-Z_]+[\w]*','name1').group()) print(re.match(r'[a-zA-Z_]+[\w]*','_name1').group()) print(re.match(r'[a-zA-Z_]+[\w]*','2_name1'))
name1
_name1
None
需求3:匹配0-99之間的任意一個數字
print(re.match('[0-9]?[0-9]','88').group()) print(re.match('[0-9]?[0-9]','8').group()) print(re.match('[0-9]?[0-9]','08').group()) print(re.match('[0-9]?[0-9]','888').group())
88
8
08
88
需求4:匹配密碼(8-20位,可以是大小寫的字母、數字、下劃線)
print(re.match('[a-zA-Z0-9_]{8,20}','12345678').group()) print(re.match('[a-zA-Z0-9_]{8}','12345678').group())
12345678
12345678
匹配邊界
^:表示以什么開頭
$:表示以什么結尾
\b:表示匹配單詞的邊界
|:或者
需求5:匹配163的郵箱地址,郵箱的用戶名包含6~18個字符,可以是數字、字母、下劃線、但是必須以字母開頭,.com結尾
emails=''' [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] ''' print(re.search('^[a-zA-Z][\w]{5,17}@163\.com$',emails,re.MULTILINE).group())
需求6:匹配單詞的邊界
print(re.search(r'.*\bbeijing\b','I Love beijing too')) print(re.search(r'.*\bbeijing\b','I Love beijing1 too')) print(re.search(r'.*beijing','I Love beijing too'))
I Love beijing
None
I Love beijing
三、re模塊的高級用法
re.findall(pattern,string)
1、findall:pattern在string里所有的非重復匹配,回傳一個迭代器iterator保存了匹配物件
需求7:匹配所有符合以下條件的郵箱
163的郵箱地址,
郵箱的用戶名包含6~18個字符,
可以是數字、字母、下劃線、
但是必須以字母開頭,
.com結尾
import re emails=''' [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] ''' #findall:pattern在string里所有的非重復匹配,回傳一個迭代器iterator保存了匹配物件 list=re.findall(r'(^[a-zA-Z][\w]{5,17}@(163|126).com$)',emails,re.MULTILINE) print(list) for email in list: print(email[0])
[(‘[email protected]’, ‘163’), (‘[email protected]’, ‘126’), (‘[email protected]’, ‘163’)]
[email protected]
[email protected]
[email protected]
2、sub:將匹配到的字串,再次進行操作
需求8:匹配一個數字,把匹配的數字進行家1,回傳
def add(result): #result是一個匹配物件 str_num=result.group() num=int(str_num)+1 return str(num) print(re.sub(r'\d+',add,'a=111'))
a=112
3、split:切割匹配成功的字串
line='hello,world,china.' print(re.split(r'\W+',line))
[‘hello’, ‘world’, ‘china’, ‘’]
需求9:以冒號或者空格,切割字串
print(re.split(r':| ','info:kobe 18 beijing'))
[‘info’, ‘kobe’, ‘18’, ‘beijing’]
四、貪婪和非貪婪模式
什么是貪婪模式?
python里數量詞默認是貪婪的,總是嘗試匹配盡可能多的字符
什么是非貪婪模式?
與貪婪模式相反,總是嘗試匹配盡可能少的字符,可以使用、?、+、{m,n}加上?,使貪婪模式變為非貪婪模式*
需求9:非貪婪模式,需求:把電話和電話的描述資訊盡可能的分開,只能用正則運算式
line2='this is my phone:188-1111-6666' #非貪婪模式,需求:把電話和電話的描述資訊盡可能的分開,只能用正則運算式 result=re.match(r'(.+?)(\d+-\d+-\d+)',line2) print(result.group(1)) print(result.group(2))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/514064.html
標籤:Python
上一篇:用python實作猜數字游戲
下一篇:使用Pytorch進行多卡訓練
