python正則表達式
正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符"),可以用來描述和匹配字符串的特定模式。
在 Python 中,使用 re 模塊來處理正則表達式。
import re
# re.match() 從字符串的開始進行匹配,如果開始部分匹配成功就返回匹配對象,否則返回None
m = re.match('foo', 'food') # 返回匹配對象
print(m) # <_sre.SRE_Match object; span=(0, 3), match='foo'>
m = re.match('foo', 'fas')
print(m) # None
# re.search() 掃描字符串,如果找到匹配就返回匹配對象,否則返回None
m = re.search('foo','hellofood')
print(m)
m = re.search('foo','hello')
print(m)
# re.findall() 查找所有匹配,返回所有匹配結果的列表
m = re.findall('ab','abcdabcdabcd')
print(m)
# re.finditer() 查找所有匹配,返回所有匹配結果的一個iterator
m = re.finditer('ab', 'abcdabcdabcd')
print(m)
for i in m:
# print(i)
print(i.group())
# re.sub() 用于替換匹配的字符串。將匹配到的字符串替換為另一個字符串
text = 'yeah, but no, but yeah, but no'
print(re.sub('but','AND',text))
接下來將重點描述re.natch()的使用:
re.match(pattern, string)
其中,pattern是正則表達式,是我們匹配時的標準,string是待匹配字符串。re.match() 從字符串的開始進行匹配,如果開始部分匹配成功就返回匹配對象,否則返回None。
首先是單字符的匹配:

# .匹配任意一個字符 除了\n ret = re.match('.','M') print(ret.group()) ret = re.match('t.o', 'two') print(ret.group()) ret = re.match('h', 'hellopython') print(ret.group()) ret = re.match('H', 'Hellopython') print(ret.group()) # 匹配[]中列舉的字符 ret = re.match('[hH]', 'hellopython') print(ret.group()) ret = re.match("[hH]ello Python","Hello Python") print(ret.group()) ret = re.match("[0123456789]Hello Python","6Hello Python") print(ret.group()) ret = re.match("[0-9]Hello Python","6Hello Python") print(ret.group()) # [a-z], [0-9],[a-zA-Z],[0-35-9]0到3和5到9 ret = re.match("[0-35-9]Hello Python","6Hello Python") print(ret.group()) # 5[3-9] 匹配 53 到 59。 # 6[0-1] 匹配 60 到 61。 pattern = r'^(5[3-9]|6[0-1])Hello Python' text = "57Hello Python" ret = re.match(pattern, text) print(ret.group() if ret else "No match") # \d 匹配數字,即0-9 ret = re.match("python\d","python2停止維護了") print(ret.group()) ret = re.match("python\d","python3發布了") print(ret.group()) # \D 匹配非數字,即不是數字 ret = re.match('\D','f') print(ret.group()) # \s 匹配空白,即空格 tab鍵 ret = re.match("hello\sworld", "hello world") print(ret.group()) # ret = re.match('hello\sword','hello\tworld') # 這句話會報錯 二者不匹配 ret = re.match("hello\sworld", "hello\tworld") print(ret.group()) ret2 = re.match("hello\sworld", "hello\tworld") if ret2: print("雙引號匹配成功:", ret2.group()) # 輸出: hello\tworld else: print("雙引號匹配失敗") # \S 匹配非空白 match_obj = re.match("hello\Sworld", "hello&world") if match_obj: result = match_obj.group() print(result) else: print("匹配失敗") match_obj = re.match("hello\Sworld", "hello$world") if match_obj: result = match_obj.group() print(result) else: print("匹配失敗") # \w 匹配非特殊字符,即a-z A-Z 0-9 _ 漢字 match_obj = re.match("\w", "A") if match_obj: # 獲取匹配結果 print(match_obj.group()) else: print("匹配失敗") # \W 匹配特殊字符 即非字母 非數字 非漢字 match_obj = re.match("\W", "&") if match_obj: # 獲取匹配結果 print(match_obj.group()) else: print("匹配失敗")
多字符的匹配:
# * 匹配前一個字符出現0次或者無限次 ret = re.match("[A-Z][a-z]*","M") print(ret.group()) ret = re.match("[A-Z][a-z]*","MnnM") print(ret.group()) ret = re.match("[A-Z][a-z]*","Aabcdef") print(ret.group()) # + 匹配前一個字符出現1次或者無限次 match_obj = re.match("py.+n", "python") if match_obj: print(match_obj.group()) else: print("匹配失敗") # ?匹配前一個字符出現1次或者0次 要么有1次要么沒有 match_obj = re.match("https?", "http") if match_obj: print(match_obj.group()) else: print("匹配失敗") # {m}匹配前一個字符出現m次 ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678") print(ret.group()) # {m,n}匹配前一個字符出現從m到n次 ret = re.match("[a-zA-Z0-9_]{8,20}","1a2b3c4d5e6f7g8h9ijklmn") print(ret.group()) info = "<div>1111</div><div>2222</div>" # 貪婪模式 ret = re.match("<div>.*</div>", info) print(ret.group()) # 非貪婪模式 ret = re.match("<div>.*?</div>", info) print(ret.group())
匹配開頭或結尾:
# 匹配開頭結尾 # ^ 匹配字符串開頭 \d 以數字開頭復習: .代表任意 *代表多次 ret = re.match("^\d.*", "6hello") print(ret.group()) # $匹配字符串結尾 \d以數字結尾 ret = re.match(".*\d$", "hello6") print(ret.group()) ret = re.match("^\d.*\d$", "6hello6") print(ret.group()) # [^指定字符] 表示除了指定字符都匹配 ret = re.match("[^aeiou]", 'ah') print(ret.group() if ret else "匹配失敗") # 或的使用 ret = re.match("mysql|flask","python") print(ret.group() if ret else "匹配失敗") # 分組的使用 (ab) 將括號中字符作為一個分組 # \w{4,10} 4-10個字符 ret = re.match("\w{4,10}@(163|126|qq|gmail)\.com","hello@qq.com") # ret = re.match("\w{4,10}@(163|126|qq|gmail)\.com","llo@qq.com") print(ret.group() if ret else "匹配失敗") ret = re.match(".+:1\d{4,10}", "電話:10086") print(ret.group() if ret else "匹配失敗")
還有分組,標識符等。

浙公網安備 33010602011771號