匹配单个字符
# match 从开头匹配 在中间不行
# -------------------------------------------------------------
# 匹配单个字符
# 从后面的字符串中匹配 以 前面字符串开头的内容
result = re.match("tz", "tz-xuge")
# 匹配成功 用group来提取数据
print(result.group()) # tz
# . 匹配任意一个字符,除了 \n
ret = re.match("t.o", "two")
print(ret.group()) # two
# [] 匹配[]中列举的字符
# h H 开头都能匹配到
ret = re.match("[hH]", "hello")
print(ret.group()) # h
ret = re.match("[hH]", "Hello")
print(ret.group()) # H
# 匹配数字 0 1 2 3 4 6 7 8 9
ret = re.match("[0-46-9]", "3xuge") # 3
print(ret.group())
ret = re.match("[0-46-9]", "5xuge") # 匹配失败
# \d 匹配数字 0-9
ret = re.match("\d", "2aw")
print(ret.group()) # 2
# \D 匹配非数字
ret = re.match("\D", "a2w")
print(ret.group()) # a
# \s 匹配空白 空格,tab键,space
ret = re.match("\s", " a2w")
print(ret.group()) # 空格
# \S 匹配非空白
ret = re.match("\S", "a2w")
print(ret.group()) # a
# \w 匹配单词字符 a-z,A-Z,0-9,_(汉字)word
ret = re.match("\w", "a2w")
print(ret.group()) # a
ret = re.match("\w", "32w")
print(ret.group()) # 3
ret = re.match("\w", "A2w")
print(ret.group()) # A
ret = re.match("\w", "我2w")
print(ret.group()) # 我
# \W 匹配非单词字符
ret = re.match("\W", " a2w")
print(ret.group()) # tab键
匹配多个字符
# * 0次或多次
ret = re.match("[A-Z][a-z]*", "MnnwwM")
print(ret.group()) # Mnnww
ret = re.match("[A-Z][a-z]*", "M")
print(ret.group()) # M
# + 1次或多次
ret = re.match("[A-Z][a-z]+", "MnnwwM")
print(ret.group()) # Mnnww
ret = re.match("[A-Z][a-z]+", "M")
# print(ret.group()) # 报错
# ? 0次或1次
ret = re.match("[A-Z][a-z]?", "MnnwwM")
print(ret.group()) # Mn
ret = re.match("[A-Z][a-z]?", "M")
print(ret.group()) # M
# {m} m次
ret = re.match("[A-Z][a-z]{2}", "MnnwwM")
print(ret.group()) # Mnn
ret = re.match("[A-Z][a-z]{4}", "MnnwwM")
print(ret.group()) # Mnnww
# {m,n} m-n次
ret = re.match("[A-Z][a-z]{2,9}", "MnnwwM")
print(ret.group()) # Mnnww
匹配字符串开头结尾
# ^ 匹配字符串开头
ret = re.match("^123456", "123456")
print(ret.group()) # 1
# $ 匹配字符串结尾
ret = re.match("[\w]{4,20}@163.com$", "320084@163.com")
print(ret.group()) # 320084@163.com
ret = re.match("[\w]{4,20}@163.com$", "320084@163.com1")
# print(ret.group()) # 报错
匹配分组
# | 匹配左右任意分组
# | 前匹配0-99 | 后匹配100
ret = re.match("[0-9]?\d$|100", "100")
print(ret.group()) # 100
# (abc) 括号里为一个分组,group()从 1 开始
ret = re.match("([\d]{4,20}@)(qq|163|gmail)\.com", "320084@qq.com")
print(ret.group()) # 320084@qq.com
print(ret.group(1)) # 320084@
print(ret.group(2)) # qq
# \num 引用分组num匹配的字符串
ret = re.match(r"<(\w*)>[\d]{1,20}</\1>", "<html>128963421</html>")
print(ret.group()) # <html>128963421</html>
# 给分组起别名 经常用在html中,见下图
# (?P<name>) 分组起别名
# (?P=name) 引用别名为name匹配的字符串
search 和 findall用法及区别
# search 不用从开头开始比较,找到第一个满足匹配要求的
ret = re.search(r"\d+", "999 nihao 999")
print(ret.group()) # 999
# findall 不用从开头开始比较,找到所有满足匹配要求的
# 注意打印方法 返回的是一个列表
ret = re.findall(r"\d+", "999 nihao 999")
print(ret[0]) # 999
print(ret[1]) # 999
sub用法
# sub (匹配规则,要替换的新内容,从哪找符合匹配规则的字符串,并进行替换)
ret = re.sub(r"\d+", '996', '我是007')
print(ret)
split用法
# split 根据规则进行字符串切割,并且返回一个列表
ret = re.split(r' |:', "info:zuo shini bb 123")
print(ret)
贪婪模式与非贪婪模式
# 注: 只有 出现+ * 等多个匹配时 才会出现贪婪匹配模式
# 贪婪匹配 不加?
ret = re.match("(\d*)([\w]*)([0-9]*)$", "234hello234")
print(ret.group(2)) # hello234
# 非贪婪 加?
ret = re.match("(\d*)([\w]*?)([0-9]*)$", "234hello234")
print(ret.group(2)) # hello