Python日常筆記(27)- 正則表達式

正則表達式

在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】優質資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章