匹配单个字符:
3 import re
4
5
6 # 只要是[]内的数字,都会匹配,只能匹配一位
7 ret = re.match(r"速度与激情[12345678]", "速度与激情6")
8 print(ret.group())
9
10
11 # 这个1-8与上面的意思相同
12 ret = re.match(r"速度与激情[1-8]", "速度与激情4")
13 print(ret.group())
14
15
16 # 因为只能匹配一位,所以就是从1到3,从6到8
17 ret = re.match(r"速度与激情[1-36-8]", "速度与激情5")
18
19 # 因为只能匹配一位,所以就是从1到3,从a到z,从A-Z
20 ret = re.match(r"速度与激情[1-3a-zA-Z]", "速度与激情a")
字符 | 功能 |
---|---|
. | 匹配任意一个字符,除了\n |
[ ] | 匹配[ ]中列举的任一字符 |
\d | 匹配数字0-9 |
\D | 匹配非数字 |
\s | 匹配空白,即空白,tab |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z,A-Z,0-9,_ |
\w | 匹配非单词字符 |
匹配多个字符
3 import re
4
5 # {数字} 数字是指前面的规则匹配的次数
6 # 1,3就是一到三都可以
7 ret = re.match(r"\d{1,3}", "13")
8
9 print(ret.group())
10
11
12 # {数字}只写一个数字,就是必须匹配这么多次
13 ret = re.match(r"\d{11}", "21312312312")
14
15 print(ret.group())
16
17
18 # ?意思是前面一位可以存在也可以不存在
19 ret = re.match(r"0375-?\d{7}", "0375-1234567")
20
21 print(ret.group())
22
23 ret = re.match(r"0375-?\d{7}", "03751234567")
24
25 print(ret.group())
26
27 # """"""里面定义的字符串,可以有换行,输出时,会以原格式输出
28 html_content = """沁园春.雪
29 北国风光,千里冰封。
30 万里雪飘。
31 望长城内外,唯余莽莽。
32 大河上下,顿失滔滔。"""
33
34 # * 将前面的规则匹配0次到无限次
35 # 但是不能匹配\n,所以需要加上re.S
36 ret = re.match(r".*", html_content, re.S)
37
38 print(ret.group())
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次到无限次 ,可以是0次 |
+ | 匹配前一个字符出现1次到无限次 ,至少有一次 |
? | 匹配前一个字符出现0次或者1次,要么有一次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现m次到n次 |
匹配开头和结尾
3 import re
4
5
6 def main():
7 names = ["names1", "_names", "9_name", "name_12", "name_!", "a#123"]
8
9
10 for i in names:
11 ret = re.match(r"^[a-zA-Z_]\w+$", i)
12 if ret:
13 print(ret.group())
14 else:
15 print("%s名称不合法", i)
16
17
18 if __name__ == "__main__":
19 main()
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
分组匹配
3 import re
4
5
6 def main():
7 email_addr = ["wang@163.com", "_asdjhk@qq.com", "hello@163.com", "22323222@qq.com", "12317@wq.das", "wanga@163Acom"]
8 for i in email_addr:
9 # 如果想同时匹配163和qq,需要在括号内加上|,就是或者的意思系统会将()里面匹配出来的数据进行单独分组
10 ret = re.match(r"^([a-zA-Z0-9_]{4,20})@(163|qq)\.com$", i)
11 if ret:
# 可以通过ret.group(数字)取出匹配出来组的数据
12 print("%s合法的邮箱地址", ret.group(), ret.group(1), ret.group(2))
13 else:
14 print("%s不合法的邮箱地址", i)
15
16 if __name__ == "__main__":
17 main()
15 html_str = "<h1>helloworld</h1>"
16 html_strt = "<h1>helloworld</h1>"
17 ret =re.match(r"<\w*>.*</\w*>", html_str)
18 print(ret.group())
# \1可以取出前面分组匹配的数据
19 ret =re.match(r"<(\w*)>.*</\1>", html_strt)
20 html_strh = "<body><h1>hello world</h1></body>"
21 ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", html_strh)
22 print(ret.group())
# 通过?P<name>对分组命名,通过?P=name取出分组的值
27 ret = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>", html_strh)
28 print(ret.group())
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号内的字符作为一个分组 |
\num | 引用该分组匹配到的字符 |
(?P<name>) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符 |
re的高级用法
3 import re
4
5
6 def add(temp):
7 num = temp.group()
8 print(num)
9
10 def main():
11 # 匹配到就结素
12 ret = re.search(r"\d+", "阅读数:9999点赞:988")
13 print(ret.group())
14
15 # 匹配全部符合规则的
16 ret = re.findall(r"\d+", "python:1234,c:324,c++:89")
17 print(ret)
18
19 # 只要匹配到数据,就替换成前面的字符
20 ret = re.sub(r"\d+", "99", "python:9989,c:988")
21 print(ret)
22
23
24 # 可以将匹配到的对象,直接传入函数中,进行别的运算
25 ret = re.sub(r"\d+", add, "python:9989,c:988")
26
27 # 可以根据规则切割字符串
28 ret = re.split(r":| ", "info:王李 12 上海")
29 print(ret)
30
31
32 if __name__ == "__main__":
33 main()