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号