一,单一字符匹配:
(1)匹配任意字符: .
import re
res = re.match(r'a..','abcd')
print(res.group())
#打印结果:abc
一点.表示匹配任意的字符。上面的代码表示匹配a后面的任意两个字符。必须从a开始。若写成 b.. 则会发生错误。
(2)匹配指定字符:[ ]
如 [ 0-9a-zA-Z ] 表示 匹配一个 0~9或所有英文字母
import re
res = re.match(r'[0-9a-zA-Z]',r'abc')
print(res.group())
#打印结果:a
(3)\d 和 \D:匹配数字和匹配非数字
import re
res = re.match(r'\d',r'123abc')
print(res.group())
#打印结果:1
(4)\s 和 \S :匹配空白字符和非空白字符(就是空格)
(5)\w 和 \W:匹配 0~9,a~z,A~Z的字符 和 非 0~9,a~z,A~Z的字符
跟[ 0-9a-zA-Z ]作用相同
(6)\b 和 \B
\b的作用是匹配一个单词边界,即是单词和空间之间的位置
例如: er\b 可以匹配 never 中的 er ,但不能匹配 verb 中的 er
二,一次匹配多个字符
(1) * 匹配前一个字符0~无限次
import re
res = re.match('1*', r'112233abcd')
print(res.group())
#打印结果:11
上面的代码由于 *的前面是1,所以可以匹配无限个1(其实只有2兆多个)
import re
res = re.match(r'\w*', r'112233abcd')
print(res.group())
#打印结果:112233abcd
上面的代码则打印全部的字符串
(2)+ 匹配前一个字符 1~无限次
+ 与 * 的区别就是 + 不允许没有匹配到字符,而 * 可以不匹配到字符
import re
res = re.match(r'1+', r'112233abcd')
print(res.group())
#打印结果:11
若:
import re
res = re.match(r'0+', r'112233abcd')
print(res.group())
#打印结果:程序报错,因为字符串里没有0
(3)?匹配前一个字符 0次或者1次
import re
res = re.match(r'1?', r'1112233abcd')
print(res.group())
#打印结果:1
(4){m} 和 {n,m} 匹配前一个字符m次 和 匹配前一个字符至少n次至多m次
import re
res = re.match(r'1{1,3}', r'111112233abcd')
print(res.group())
#打印结果:111
三,字符串边界匹配
(1)^ 和 $ 在字符串中
^用在字符串中表示匹配时,^后的第一个字符必须在字符串的第一个位置,而$则规定$前面的内容必须在字符串的最后才能匹配成功,如:
import re
#匹配电子邮箱
res = re.match(r'\w{3,10}@163.com$',r'zje@163.commm')
print(res.group())
#打印结果:程序出现错误,因为$表示所在位置必须是字符串的结尾
res = re.match(r'\w{3,10}@163.com$',r'zje@163.com')
print(res.group())
#打印结果:zje@163.com
(2)\A 和 \Z
作用和 ^ 和 $ 一样。
四,分组匹配
(1) |
A|B 的作用是匹配 A 或 B,如:
import re
#匹配电子邮箱
res = re.match(r'\w+@(163|126|qq)\.com',r'zje@126.com')
print(res.group())
#打印结果:zje@126.com
#这样写不仅可以匹配126的邮箱,还能匹配163和qq邮箱。
(2)分组(ab):作用是()中的ab被视为一个分组
import re
#匹配电子邮箱
reg = r'<(dir>)\w+</\1'
str = r'<dir>test_zje</dir>'
res = re.match(reg,str)
print(res.group())
#打印结果:<dir>test_zje</dir>
#上面的代码 括号()括起了 dir> 表示 dir> 为第一个分组,所以后面的\1 就表示第一个分组 dir>
当然也可以给分组起一个名字,用名字来引用分组,如:
import re
#匹配电子邮箱
reg = r'<(?P<mark>[\w]+>).+</(?P=mark)'
str = r'<dir>test_zje</dir>'
res = re.match(reg,str)
print(res.group())
#打印结果:<dir>test_zje</dir>
#上面的代码 把第一个分组命名为 mark,然后(?P=mark)表示引用一个命名为mark的分组
(3)向前向后查找
只有在组内才能向前向后查找
如在字符串 src="http://www.xxxxxxx.jpg" 中的 http://www.xxxxxxx.jpg
正则可以这样写: reg = r' ((?<=src=")http://www.xxxxxxx.1.jpg(?=") ) '
前面的(?<=src=)表示若字符串中有 “src=” 这个字符串则匹配,但不返回 “src=“ 这个字符串,用在正则表达式之前
后面的(?=")表示若字符串中有 双引号“ 则匹配,但不返回 双引号” ,用在正则表达式之后。