標籤:

一起學Python:正則表達式概述

re模塊操作

在Python中需要通過正則表達式對字元串進行匹配的時候,可以使用一個模塊,名字為re

1. re模塊的使用過程

#coding=utf-8 # 導入re模塊 import re # 使用match方法進行匹配操作n result = re.match(正則表達式,要匹配的字元串) # 如果上一步匹配到數據的話,可以使用group方法來提取數據n result.group()n

2. re模塊示例(匹配以itcast開頭的語句)

#coding=utf-8 import renn result = re.match("itcast","itcast.cn")nn result.group()n

運行結果為:

itcastn

3. 說明

  • re.match() 能夠匹配出以xxx開頭的字元串

匹配單個字元

在上一小節中,了解到通過re模塊能夠完成使用正則表達式來匹配字元串

本小節,將要講解正則表達式的單字元匹配

字元 功能 . 匹配任意1個字元(除了n) [ ] 匹配[ ]中列舉的字元 d 匹配數字,即0-9 D 匹配非數字,即不是數字 s 匹配空白,即 空格,tab鍵 S 匹配非空白 w 匹配單詞字元,即a-z、A-Z、0-9、_ W 匹配非單詞字元 示例1:

#coding=utf-8import rennret = re.match(".","M")nprint(ret.group())nnret = re.match("t.o","too")nprint(ret.group())nnret = re.match("t.o","two")nprint(ret.group())n

運行結果:

Mntoontwon

示例2:

#coding=utf-8import re# 如果hello的首字元小寫,那麼正則表達式需要小寫的hret = re.match("h","hello Python") nprint(ret.group())# 如果hello的首字元大寫,那麼正則表達式需要大寫的Hret = re.match("H","Hello Python") nprint(ret.group())# 大小寫h都可以的情況ret = re.match("[hH]","hello Python")nprint(ret.group())nret = re.match("[hH]","Hello Python")nprint(ret.group())nret = re.match("[hH]ello Python","Hello Python")nprint(ret.group())# 匹配0到9第一種寫法ret = re.match("[0123456789]Hello Python","7Hello Python")nprint(ret.group())# 匹配0到9第二種寫法ret = re.match("[0-9]Hello Python","7Hello Python")nprint(ret.group())nnret = re.match("[0-35-9]Hello Python","7Hello Python")nprint(ret.group())# 下面這個正則不能夠匹配到數字4,因此ret為Noneret = re.match("[0-35-9]Hello Python","4Hello Python")# print(ret.group()) n

運行結果:

hnHnhnHnHello Python7Hello Python7Hello Python7Hello Pythonn

示例3:

#coding=utf-8import re# 普通的匹配方式ret = re.match("嫦娥1號","嫦娥1號發射成功") print(ret.group())nnret = re.match("嫦娥2號","嫦娥2號發射成功") nprint(ret.group())nnret = re.match("嫦娥3號","嫦娥3號發射成功") nprint(ret.group())# 使用d進行匹配ret = re.match("嫦娥d號","嫦娥1號發射成功") print(ret.group())nnret = re.match("嫦娥d號","嫦娥2號發射成功") nprint(ret.group())nnret = re.match("嫦娥d號","嫦娥3號發射成功") nprint(ret.group())n

運行結果:

嫦娥1號n嫦娥2號n嫦娥3號n嫦娥1號n嫦娥2號n嫦娥3號n

說明

  • 其他的匹配符參見後面章節的講解

匹配多個字元

匹配多個字元的相關格式

字元 功能 * 匹配前一個字元出現0次或者無限次,即可有可無 + 匹配前一個字元出現1次或者無限次,即至少有1次 ? 匹配前一個字元出現1次或者0次,即要麼有1次,要麼沒有 {m} 匹配前一個字元出現m次 {m,n} 匹配前一個字元出現從m到n次 示例1:

需求:匹配出,一個字元串第一個字母為大小字元,後面都是小寫字母並且這些小寫字母可有可無

#coding=utf-8import rennret = re.match("[A-Z][a-z]*","M")nprint(ret.group())nnret = re.match("[A-Z][a-z]*","MnnM")nprint(ret.group())nnret = re.match("[A-Z][a-z]*","Aabcdef")nprint(ret.group())n

運行結果:

MnMnnnAabcdefn

示例2:

需求:匹配出,變數名是否有效

#coding=utf-8import rennames = ["name1", "_name", "2_name", "__name__"]for name in names:nret = re.match("[a-zA-Z_]+[w]*",name) if ret:nprint("變數名 %s 符合要求" % ret.group()) else:nprint("變數名 %s 非法" % name)n

運行結果:

變數名 name1 符合要求n變數名 _name 符合要求n變數名 2_name 非法n變數名 __name__ 符合要求n

示例3:

需求:匹配出,0到99之間的數字

#coding=utf-8import renret = re.match("[1-9]?[0-9]","7")nprint(ret.group())nret = re.match("[1-9]?d","33")nprint(ret.group())nret = re.match("[1-9]?d","09")nprint(ret.group())n

運行結果:

7330 # 這個結果並不是想要的,利用$才能解決

示例4:n

需求:匹配出,8到20位的密碼,可以是大小寫英文字母、數字、下劃線

#coding=utf-8import renret = re.match("[a-zA-Z0-9_]{6}","12a3g45678")nprint(ret.group())nret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")nprint(ret.group())n

運行結果:

12a3g41ad12f23s34455ff66n

匹配開頭結尾

字元 功能 ^ 匹配字元串開頭 $ 匹配字元串結尾 示例1:

需求:匹配163.com的郵箱地址

#coding=utf-8import rennemail_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]for email in email_list:n ret = re.match("[w]{4,20}@163.com", email) n if ret:n print("%s 是符合規定的郵件地址,匹配後的結果是:%s" % (email, ret.group())) n else:n print("%s 不符合要求" % email)n

運行結果:

xiaoWang@163.com n是符合規定的郵件地址,匹配後的結果是:nxiaoWang@163.comnxiaoWang@163.comheihein是符合規定的郵件地址,匹配後的結果是:nxiaoWang@163.comn.com.xiaowang@qq.com 不符合要求n

完善後

email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]nnfor email in email_list:n ret = re.match("[w]{4,20}@163.com$", email)n if ret:n print("%s 是符合規定的郵件地址,匹配後的結果是:%s" % (email, ret.group()))n else:n print("%s 不符合要求" % email)n

運行結果:

xiaoWang@163.com 是符合規定的郵件地址,n匹配後的結果是:xiaoWang@163.comnxiaoWang@163.comheihei 不符合要求n.com.xiaowang@qq.com 不符合要求n

匹配分組

字元 功能 (ab) 將括弧中字元作為一個分組 num 引用分組num匹配到的字元串 示例1:

需求:匹配出0-100之間的數字

#coding=utf-8 import rennret = re.match("[1-9]?d","8")nprint(ret.group()) # 8nnret = re.match("[1-9]?d","78")nprint(ret.group()) # 78 # 不正確的情況nret = re.match("[1-9]?d","08")nprint(ret.group()) # 0 # 修正之後的nret = re.match("[1-9]?d$","08")nif ret:n print(ret.group())nelse:n print("不在0-100之間")nn# 添加|nret = re.match("[1-9]?d$|100","8")nprint(ret.group()) # 8nnret = re.match("[1-9]?d$|100","78")nprint(ret.group()) # 78nnret = re.match("[1-9]?d$|100","08")n# print(ret.group()) # 不是0-100之間nnret = re.match("[1-9]?d$|100","100")nprint(ret.group()) # 100 n

示例2:

需求:匹配出163、126、qq郵箱

#coding=utf-8 import rennret = re.match("w{4,20}@163.com", "test@163.com")nprint(ret.group()) # test@163.comnnret = re.match("w{4,20}@(163|126|qq).com", "test@126.com")nprint(ret.group()) # test@126.comnnret = re.match("w{4,20}@(163|126|qq).com", "test@qq.com")nprint(ret.group()) # test@qq.comnnret = re.match("w{4,20}@(163|126|qq).com", "test@gmail.com")nif ret:n print(ret.group())nelse:n print("不是163、126、qq郵箱") # 不是163、126、qq郵箱 n

不是以4、7結尾的手機號碼(11位)

import re

tels = ["13100001234", "18912344321", "10086", "18800007777"]for tel in tels:

ret = re.match("1d{9}[0-35-68-9]", tel)

if ret:

print(ret.group())

else:

print("%s 不是想要的手機號" % tel)

提取區號和電話號碼

>>> ret = re.match("([^-]*)-(d+)","010-12345678")n>>> ret.group()n010-12345678 >>> ret.group(1)n010 >>> ret.group(2)n12345678 n

示例3:

需求:匹配出<html>hh</html>

#coding=utf-8 import renn# 能夠完成對正確的字元串的匹配nret = re.match("<[a-zA-Z]*>w*</[a-zA-Z]*>", "<html>hh</html>")nprint(ret.group())nn# 如果遇到非正常的html格式字元串,匹配出錯nret = re.match("<[a-zA-Z]*>w*</[a-zA-Z]*>", "<html>hh</htmlbalabala>")nprint(ret.group())nn# 正確的理解思路:如果在第一對<>中是什麼,按理說在後面的那對<>中就應該是什麼 # 通過引用分組中匹配到的數據即可,但是要注意是元字元串,即類似 r""這種格式nret = re.match(r"<([a-zA-Z]*)>w*</1>", "<html>hh</html>")nprint(ret.group())nn# 因為2對<>中的數據不一致,所以沒有匹配出來ntest_label = "<html>hh</htmlbalabala>"nret = re.match(r"<([a-zA-Z]*)>w*</1>", test_label)nif ret:n print(ret.group())nelse:n print("%s 這是一對不正確的標籤" % test_label)n

運行結果:

<html>hh</html> n<html>hh</htmlbalabala>n <html>hh</html> n<html>hh</htmlbalabala>n 這是一對不正確的標籤 n

示例4:

需求:匹配出<html><h1>www.itcast.cn</h1></html>

#coding=utf-8 import re

labels = ["<html><h1>itcast.cn</h1></html>", "<html><h1>itcast.cn</h2></html>"]

for label in labels:

ret = re.match(r"<(w*)><(w*)>.*</2></1>", label)

if ret:

print("%s 是符合要求的標籤" % ret.group())

else:

print("%s 不符合要求" % label)

運行結果:

<html><h1>itcast.cn</h1></html> 是符合要求的標籤

<html><h1>itcast.cn</h2></html> 不符合要求

示例5:

需求:匹配出<html><h1>www.itcast.cn</h1></html>

#coding=utf-8 import rennret = re.match(r"<(?P<name1>w*)><(?P<name2>w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")nret.group()nnret = re.match(r"<(?P<name1>w*)><(?P<name2>w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h2></html>")nret.group() n

注意:(?P<name>)(?P=name)中的字母p大寫

運行結果:

原文鏈接:做最專業最懂你的python開發者交流平台,提供你最需要的開發學習資源。 我們專註於python開發技術的學習與交流,我們堅持,每天進步一小步,人生進步一大步!關注【Python開發者交流平台】,與我們一起學習進步。

歡迎關注!歡迎通過公眾號諮詢專業問題,我會儘力回復!

推薦閱讀:

十分鐘搞定pandas
python selenium模塊使用出錯,這個怎麼改?
【翻譯搬運】SciPy-Python科學演算法庫
Project Euler上的程序語言排行為什麼Matlab比Python低那麼多?
看完廖雪峰的python,但是感覺自己掌握不紮實,不知道該怎麼做?

TAG:Python |