正则表达式:
re模块:
在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re
re模块的使用过程:
# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式, 要匹配的字符串)
# 如果上一步匹配到数据的话, 可以使用group方法来提取数据
result.group()
re模块示例:
import re
result = re.match("itcast", "itcast.cn")
print(result)
print(result.group())
# 运行结果为:
<re.Match object; span=(0, 6), match='itcast'>
itcast
匹配单个字符:
示例1:.
import re
# .匹配任意一个字符, 除了\n
ret = re.match(".", "M")
print(ret.group())
ret = re.match("t.o", "too")
print(ret.group())
ret = re.match("t.o", "two")
print(ret.group())
# 运行结果为:
M
too
two
示例2:[]
import re
# []匹配[]中列举的字符
# 如果hello的首字符小写, 那么正则表达式需要小写的h
ret = re.match("h", "hello Python")
print(ret.group())
# 大写小写h都可以的情况
ret = re.match("[Hh]", "hello python")
print(ret.group())
ret = re.match("[Hh]", "Hello python")
print(ret.group())
# 匹配0到9的写法
ret = re.match("[0-9]", "5hello python")
print(ret.group())
# 下面这个正则不能匹配到数字4(因为是3-5和5-9), 因此ret为None
ret = re.match("[0-35-9]Hello python", "4Hello python")
# print(ret.group())
# 运行结果为:
h
h
H
5
示例3:\d
import re
# \d匹配数字, 即0-9
# 使用\d进行匹配,
ret = re.match("嫦娥\d号", "嫦娥1号发射成功")
print(ret.group())
# 运行结果为:
嫦娥一号
示例4:\D
import re
# \D匹配非数字,即不是数字
ret = re.match("\D", "a957")
print(ret.group())
# 运行结果为:
a
示例5:\s
import re
# 匹配空白,即空格,tab键
ret = re.match("\s", " 123")
print(ret.group())
# 运行结果为:
(空格)
示例6:\S
import re
# 匹配到非空白
ret = re.match("\s", "a a")
print(ret.group())
# 运行结果为:
a
示例7:\w
import re
# 匹配单词字符,即az,AZ,0-9,_
ret = re.match("\w", "_123")
print(ret.group())
# 运行结果为:
_
示例8:\W
import re
# 匹配非单词字符
ret = match("\W", "$a123")
print(ret.group())
# 运行结果为:
$
匹配多个字符:
示例1:*
import re
# *匹配前一个字符出现0次或者无限次,即可有可无
ret = match("[A-Z]*[a-z]*", "abcABC")
print(ret.group())
# 运行结果为:
abcABC
示例2:+
import re
# +匹配前一个字符出现1次或者无限次,即至少有1次
ret = match("[zo]+", "zozozozozozozo")
print(ret.group())
# 运行结果为:
zozozozozozozo
示例3:?
import re
# 匹配前一个字符出现1次或者0次,即要么1次,要么没有
ret = match("[0-9]?[0-9]", "7")
print(ret.group())
# 运行结果为:
7
示例4:{m}
import re
# 匹配前一个字符出现m次
ret = re.match("[a-zA-Z0-9_]{6}", "12a3g45678")
print(ret.group())
# 运行结果为:
12a3g4
示例5:{m, n}
import re
# 匹配前一个字符出现从m到n次
ret = re.match("[a-zA-Z0-9_]{3,6}", "1z2x3c1z2x")
print(ret.group())
# 运行结果为:
1z2x3c
匹配开头结尾:
示例1:$
# 匹配163.com的邮箱地址
import re
email_list = ["haha@163.com", "hehe@163.com", ".com.lili@qq.com"]
for email in email_list:
ret = re.match("[\w]{4,20}@163\.com$", email)
if ret:
print("%s 是符合规定的邮箱地址,匹配后的结果是:%s" % (email, ret.group()))
else:
print("%s 不符合要求" % email)
# 运行结果为:
xiaoWang@163.com 是符合规定的邮件地址,匹配后的结果是:xiaoWang@163.com
xiaoWang@163.comheihei 不符合要求
.com.xiaowang@qq.com 不符合要求
match默认从开头匹配,所以不用添加^
匹配分组:
r""的过程:
由于原始字符串中所有字符直接按照字面意思来使用,不转义特殊字符,故不做“字符串转义”,直接进入第二步“正则转义”,在正则转义中“\”被转义为了“\”,表示该正则式需要匹配一个反斜杠。
示例1:|
import re
# 匹配左右任意一个表达式
ret = re.match("[1-9]?\d$|100", "100")
print(ret.group()) # 100 如果没有|100就只能到99
# 运行结果为:
100
示例2:()
import re
ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@qq.com")
if ret:
print(ret.group())
print(ret.group(1))
else:
print("不是163,126,qq邮箱")
# 运行结果为:
qq
test@qq.com
示例3:(?P<name>)(?P=name)
import re
# 分组起别名
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")
print(ret.group())
print(ret.group('name1'))
print(ret.group('name2'))
# 运行结果为:
<html><h1>www.itcast.cn</h1></html>
html
h1