正则表达式
-
. 匹配任意字符(不包括换行符)
-
^ 匹配开始位置,多行模式下匹配每一行的开始
-
$ 匹配结束位置,多行模式下匹配每一行的结束
-
* 匹配前一个元字符0到多次
-
+ 匹配前一个元字符1到多次
-
? 匹配前一个元字符0到1次
-
{m,n} 匹配前一个元字符m到n次
-
转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如.只能匹配.,不能再匹配任意字符
-
[] 字符集,一个字符的集合,可匹配其中任意一个字符
-
| 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
-
(...) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺序决定索引值
-
(?iLmsux) 分组中可以设置模式,iLmsux之中的每个字符代表一个模式,用法参见 模式 I
-
(?:...) 分组的不捕获模式,计算索引时会跳过这个分组
-
(?P<name>...) 分组的命名模式,取此分组中的内容时可以使用索引也可以使用name
-
(?P=name) 分组的引用模式,可在同一个正则表达式用引用前面命名过的正则
-
(?#...) 注释,不影响正则表达式其它部分,用法参见 模式 I
-
(?=...) 顺序肯定环视,表示所在位置右侧能够匹配括号内正则
-
(?!...) 顺序否定环视,表示所在位置右侧不能匹配括号内正则
-
(?<=...) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则
-
(?<!...) 逆序否定环视,表示所在位置左侧不能匹配括号内正则
-
(?(id/name)yes|no) 若前面指定id或name的分区匹配成功则执行yes处的正则,否则执行no处的正则
-
umber 匹配和前面索引为number的分组捕获到的内容一样的字符串
-
A 匹配字符串开始位置,忽略多行模式
-
匹配字符串结束位置,忽略多行模式
-
匹配位于单词开始或结束位置的空字符串
-
B 匹配不位于单词开始或结束位置的空字符串
-
d 匹配一个数字, 相当于 [0-9]
-
D 匹配非数字,相当于 0-9
-
s 匹配任意空白字符, 相当于 [ fv]
-
S 匹配非空白字符,相当于 fv
-
w 匹配数字、字母、下划线中任意一个字符, 相当于 [a-zA-Z0-9_]
-
W 匹配非数字、字母、下划线中的任意字符,相当于 a-zA-Z0-9_
1) 贪婪语法 .*,取尽可能多的任意字符 w+,取尽可能多的任意英文字母与数字一次以上 d{2,5},尽可能取到2--5个数字字母 s+,},尽可能取到任意多个空格一次以上 .?,任意字符取0次,或1次,尽可能取1次
2) 非贪婪语法 就是在贪婪定义后面加一个? .*?,取尽可能少的任意字符,尽可能不取 w+?,取尽可能少的任意英文字母与数字,尽可能只取1个 d{2,5},尽可能少数字字母,尽可能只取2个 s+,},尽可能取到最少空格,尽可能只取1个空格 .??,任意字符取0次,或1次,尽可能取0次
3) 贪婪与贪婪的最终匹配 无论贪婪,还是非贪婪,都要与后面内容继续匹配,才能最终确定本次匹配内容,有时给合后面匹配内容时,两都取值相同
匹配分组
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
um |
引用分组num匹配到的字符串 |
(?P<name>) |
分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
import re
#匹配出163、126、qq邮箱
ret=re.match("w{4,20}@163.com$","lisus2000@163.com")
print(ret.group())
ret=re.match("w{4,20}@(163|126|qq).com","test@qq.com")
if ret:
print(ret.group())
else:
print("不是163、126、qq邮箱") # 不是163、126、qq邮箱
import re
ret=re.match(r"<([a-zA-Z]*)>w*</1>","<html>hh</html>")
print(ret.group())
#因为2对<>中的数据不一致,所以没有匹配出来
test_label = "<html>hh</htmlbalabala>"
ret = re.match(r"<([a-zA-Z]*)>w*</1>", test_label)
if ret:
print(ret.group())
else:
print("%s 这是一对不正确的标签" % test_label)
#需求:匹配出<html><h1>www.baidu.cn</h1></html>
labels = ["<html><h1>www.baidu.cn</h1></html>", "<html><h1>www.google.cn</h2></html>"]
for label in labels:
ret=re.match(r"<(w*)><(w)>.</2></1>",label)
if ret:
print("%s 是符合要求的标签" % ret.group())
else:
print("%s 不符合要求" % label)