一.单字符匹配
1."\d":匹配数字0-9
import re
print(re.match("速度与激情\d", "速度与激情1").group())
2."\D":匹配非数字
import re
print(re.match("速度与激情\D", "速度与激情*").group())
print(re.match("速度与激情\D", "速度与激情a").group())
3."[]":匹配[]中举例的字符
import re
print(re.match("速度与激情[12345678]", "速度与激情2").group())
print(re.match("速度与激情[1-8]", "速度与激情3").group())
print(re.match("速度与激情[1-36-8]", "速度与激情6").group())
print(re.match("速度与激情[1-3a-dC-H]", "速度与激情D").group())
4.\s":匹配空白符,即空格,tab键
import re
print(re.match("速度与激情\s", "速度与激情 ").group())
print(re.match("速度与激情\s", "速度与激情\t").group())
5."\S":匹配非空白
import re
print(re.match("速度与激情\S", "速度与激情二").group())
print(re.match("速度与激情\S", "速度与激情!").group())
print(re.match("速度与激情\S", "速度与激情8").group())
print(re.match("速度与激情\S", "速度与激情A").group())
6."\w":匹配单词字符,即a-z,A-Z,0-9,_
import re
print(re.match("速度与激情\w", "速度与激情A").group())
print(re.match("速度与激情\w", "速度与激情8").group())
print(re.match("速度与激情\w", "速度与激情_").group())
7."\W":匹配非单词字符
import re
print(re.match("速度与激情\W", "速度与激情?").group())
print(re.match("速度与激情\W", "速度与激情 ").group())
8. “.”:匹配任意一个字符,除了\n
import re
print(re.match("速度与激情.", "速度与激情_").group())
print(re.match("速度与激情.", "速度与激情6").group())
print(re.match("速度与激情.", "速度与激情f").group())
print(re.match("速度与激情.", "速度与激情&").group())
print(re.match("速度与激情.", "速度与激情三").group())
二.多字符匹配
1."{m}":匹配前一个字符出现m次
import re
print(re.match(r"\d{4}", "1111").group())
print(re.match(r"苹果\d{3}", "苹果222").group())
2."{m.n}":匹配前一个字符出现m次到n次
import re
print(re.match(r"\d{1,5}", "11111").group())
print(re.match(r"\d{1,5}", "222").group())
3."?":匹配前一个字符出现1次或者0次
import re
print(re.match(r"\d{3,4}-?\d{8}", "000-12345678").group())
print(re.match(r"\d{3,4}-?\d{8}", "00012345678").group())
4."+":匹配前一个字符出现1次或者一次以上
import re
print(re.match(r".+", "a").group())
print(re.match(r".+", "asdfghj").group())
5."*":匹配前一个字符可有可无
import re
content = """hello
world
redhat"""
print(re.match(r".*", content).group()) # "."不匹配\n
print()
print(re.match(r".*", content,re.S).group())
三.匹配开头结尾
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
1.匹配出变量名是否有效
import re
names=["name1","_name","2_name","__name__","_name!"]
for name in names:
ret = re.match("^[a-zA-Z_][a-zA-Z_0-9]*$",name)
if ret:
print("变量名 %s符合要求" % name)
else:
print("变量名 %s不合法" % name)
2.匹配163邮箱地址
匹配出163的邮箱地址,且@之前有4-20位,例如hello@163.com
import re
def main():
email_addr = input("请输入邮箱地址:")
ret = re.match("[a-zA-Z_0-9]{4,20}@163\.com$", email_addr) # 特殊符号需要转义
if ret:
print("%s 是正确的邮箱地址" % ret.group())
else:
print("%s不符合要求" % ret.group())
if __name__ == '__main__':
main()
四.匹配分组
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P<name>) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
1. 应用|和()
import re
ret = re.match("([a-zA-Z_0-9]{4,20})@(163|126)\.com$", "123456@163.com") # 一个“()”分为一组,最后一组可以不用“()”
print(ret.group())
print(ret.group(1))
print(ret.group(2))
2.引用分组num匹配到的字符串
import re
ret = re.match(r"<(\w*)>.*</\1>","<h1>hello</h1>")
print(ret.group())
print()
ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>","<body><h1>hello</h1></body>")
print(ret.group())
3.分组别名的应用
import re
ret = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>","<body><h1>hello</h1></body>")
print(ret.group())
五.re模块的高级用法
1.search不会从头匹配
import re
ret = re.search(r"\d+","阅读量:9999") # 不会从头匹配
print(ret.group())
2.findall匹配所有数字
import re
ret = re.findall(r"\d+","python = 9999, c = 7890, c++ = 1234") # 匹配所有数字
print(ret)
3.sub将匹配到的数据进行替换
(1):
import re
ret = re.sub(r"\d+","1111","python = 9999,c = 1024") # 替换所有匹配的数字
print(ret)
(2):
import re
def add(temp):
strNum = temp.group()
num = int(strNum) + 1
return str(num)
ret = re.sub(r"\d+",add, "python = 997")
print(ret)
ret = re.sub(r"\d+",add, "python = 99")
print(ret)