正則表達式
在Python中需要通過正則表達式對字符串進行匹配的時候,可以使用一個模塊,名字爲re
import re
# 判斷字符串中是否包含hello字符串
bool = re.match("hello", "hello world")
# 如果有返回值則表示包含,沒有則表示不包含
print(bool)
# 判斷字符串中是否包含大小寫h和H字符
bool = re.match("[hH]", "hello world")
print(bool)
bool = re.match("[hH]", "Hello world")
print(bool)
匹配單個字符
. 匹配任意1個字符(除了\n)
import re
# . 匹配任意1個字符(除了\n)
ret = re.match(".", "adfasdfasfdsa")
print(ret.group())
ret = re.match("a.o", "aaodfasfsa")
print(ret.group())
ret = re.match("aaa.o", "aaaooo")
print(ret.group())
打印結果:
a
aao
aaaoo
[ ] 匹配[ ]中列舉的字符
# [ ] 匹配[ ]中列舉的字符
import re
# 如果hello的首字符小寫,那麼正則表達式需要小寫的h
ret = re.match("h", "hello Python")
print(ret.group())
# 如果hello的首字符大寫,那麼正則表達式需要大寫的H
ret = re.match("H", "Hello Python")
print(ret.group())
# 大小寫hH都可以的情況
ret = re.match("[hH]", "hello Python")
print(ret.group())
ret = re.match("[hH]", "Hello Python")
print(ret.group())
ret = re.match("[hH]ello Python", "Hello Python")
print(ret.group())
# 匹配0到9寫法
ret = re.match("[0-9]Hello Python", "7Hello Python")
print(ret.group())
# 匹配0到3或者5到9寫法
ret = re.match("[0-35-9]Hello Python", "7Hello Python")
print(ret.group())
# 下面這個正則不能夠匹配到數字4,因此ret爲None
ret = re.match("[0-35-9]Hello Python", "4Hello Python")
print(ret.group())
\d 匹配數字,即0-9
import re
# 使用\d進行匹配
ret = re.match("aaa\da", "aaa1aa")
print(ret.group())
ret = re.match("aaa\da", "aaa2aa")
print(ret.group())
ret = re.match("aaa\da", "aaa3aa")
print(ret.group())
# 打印結果:
aaa1a
aaa2a
aaa3a
\s 匹配空白,即 空格,tab鍵
import re
# 使用\s進行匹配
ret = re.match("aaa\sa", "aaa aa")
print(ret.group())
ret = re.match("aaa\sa", "aaa\taa")
print(ret.group())
#打印結果
aaa a
aaa a
\w 匹配單詞字符,即a-z、A-Z、0-9、_,並且包含中文
import re
# 使用\s進行匹配
ret = re.match("aaa\wa", "aaataa")
print(ret.group())
ret = re.match("aaa\wa", "aaa我aa")
print(ret.group())
#打印結果:
aaata
aaa我a
匹配多個字符
* 匹配前一個字符出現0次或者無限次,即可有可無
import re
ret = re.match("[A-Z][a-z]*", "Aaaabbbbb")
print(ret.group())
ret = re.match("[a-z,1-9]*", "111dasf,asfsa")
print(ret.group())
打印結果:
Aaaabbbbb
111dasf,asfsa
Aabcdef
+ 匹配前一個字符出現1次或者無限次,即至少有1次
import re
names = ["name1", "_name", "2_name", "__name__", "$name__"]
for name in names:
ret = re.match("[a-zA-Z_]+[\w]*",name)
if ret:
print(f"{name}合法,{ret.group()}")
else:
print(f"{name}不合法")
打印結果:
name1合法,name1
_name合法,_name
2_name不合法
__name__合法,__name__
$name__不合法
? 匹配前一個字符出現1次或者0次,即要麼有1次,要麼沒有
import re
ret = re.match("[1-9]?[a-z]", "aaa")
print(ret.group())
ret = re.match("[1-9]?\d", "33fff")
print(ret.group())
打印結果:
a
33
0
# {m}匹配前一個字符出現m次,{m,n}匹配前一個字符出現從m到n次
import re
# 表示1-9數字出現1次或者2次
ret = re.match("[1-9]{1,2}", "12dd")
print(ret.group())
# 表示a-zA-Z,0-9_一共出現6次
ret = re.match("[a-zA-Z,0-9_]{6}", "12a3,g45678")
print(ret.group())
# 表示a-zA-Z0-9_一共出現8次到20次之間
ret = re.match("[a-zA-Z0-9_]{8,20}", "1ad12f23s34455ff66")
print(ret.group())
打印結果:
12
12a3,g
1ad12f23s34455ff66
匹配開頭結尾
^ 匹配字符串開頭
import re
# 必須以a開頭的字符才正確
ret = re.match("^a[a-z]*", "cdsfasdfasfd")
print(ret.group())
ret = re.match("^a[a-z]*", "adsfasdfasfd")
print(ret.group())
結果打印:
adsfasdfasfd
$ 匹配字符串結尾,判斷郵箱
import re
# 判斷郵箱[email protected]
ret = re.match("^\w{4,20}@qq\.com", "[email protected]")
print(ret.group())
ret = re.match("^[a-z0-9A-Z]{4,20}@qq\.com$", "[email protected]")
print(ret.group())
結果打印:
99aa9dd9@qq.com
99aa9dd9@qq.com
$ 匹配字符串結尾,循環判斷郵箱
import re
email_list = ["[email protected]", "[email protected]", "[email protected]"]
for email in email_list:
ret = re.match("^[a-z0-9A-Z]{4,20}@163\.com$", email)
if ret:
print(f"{ret.group()}符合")
else:
print(f"{email}不符合")
|() 分組判斷郵箱,這個|就是或者的意思,()小括號就是分組的意思
import re
email_list = ["[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"]
for email in email_list:
# (163|126|qq)表示163或者126或者qq都可以,這個|就是或者的意思,()小括號就是分組的意思
ret = re.match("^[a-z0-9A-Z]{4,20}@(163|126|qq)\.com$", email)
if ret:
print(f"{ret.group()}符合")
else:
print(f"{email}不符合")
根據|()group獲取分組的值
import re
ret = re.match("(http|https)://www.([a-z0-9]+)\.(com|cn|net|org|vip)/(index.html|index.jsp)", "http://www.baidu.com/index.html")
print(ret.group(1))
print(ret.group(2))
print(ret.group(3))
print(ret.group(4))
\num 引用分組num匹配到的字符串
注意:使用正則表達式時使用一個r””表示格式化正則
# \num 引用分組num匹配到的字符串
import re
str1 = "<body><h1>asdfasfsa</h1></body>"
# ()表示分組\1表示獲取從左到右的第1個分組配對,也就是一模一樣的字符,\2表示直接使用第二個分組
ret = re.match(r"<(\w*)>.*</\1>", str1)
print(ret.group())
str1 = "<body><h1>asdfasfsa</h1></body>"
ret = re.match(r"<(\w*)><(\w*)>\w*</\2></\1>", str1)
print(ret.group())
(?P)分組起別名,(?P=name) 引用別名爲name分組匹配到的字符串
import re
str1 = "<body><h1>asdfasfsa</h1></body>"
# ()表示分組?P<p1>這個是爲第一個分組取一個別名,?P=p1,意思是將第一個分組的在此處引用
ret = re.match(r"<(?P<p1>\w*)>.*</(?P=p1)>", str1)
print(ret.group())
str1 = "<body><h1>asdfasfsa</h1></body>"
# 意思同上
ret = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>\w*</(?P=p2)></(?P=p1)>", str1)
print(ret.group())
高級語法
import re
# search用法
ret = re.search(r"(\d+)", "python = 9999, c = 7890, c++ = 12345")
print(ret.group())
# findall用法,搜索到所有的
ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)
sub 將匹配到的數據進行替換 將匹配到的閱讀次數加1
ret = re.sub(r"\d+", '998', "python = 997")
print(ret)
# 第二種方式,可以使用方法的引用
def add(temp):
strNum = temp.group()
num = int(strNum) + 1
return str(num)
# 將正則獲取的值傳入add方法,然後執行完成後在替換
ret = re.sub(r"\d+", add, "python = 997")
print(ret)
split 根據匹配進行切割字符串,並返回一個列表
# 以:冒號和空格2個字符來切割字符串“info:xiaoZhang 33 shandong”
ret = re.split(r":| ", "info:xiaoZhang 33 shandong")
print(ret)
作者:阿超
原創公衆號:『Python日常筆記』,專注於 Python爬蟲等技術棧和有益的程序人生,會將一些平時的日常筆記都慢慢整理起來,也期待你的關注和阿超一起學習,公衆號回覆【csdn】優質資源。