正则匹配

正则表达式

  • . 匹配任意字符(不包括换行符)

  • ^ 匹配开始位置,多行模式下匹配每一行的开始

  • $ 匹配结束位置,多行模式下匹配每一行的结束

  • * 匹配前一个元字符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处的正则

  • \number 匹配和前面索引为number的分组捕获到的内容一样的字符串

  • \A 匹配字符串开始位置,忽略多行模式

  • \Z 匹配字符串结束位置,忽略多行模式

  • \b 匹配位于单词开始或结束位置的空字符串

  • \B 匹配不位于单词开始或结束位置的空字符串

  • \d 匹配一个数字, 相当于 [0-9]

  • \D 匹配非数字,相当于 0-9

  • \s 匹配任意空白字符, 相当于 [ \t\n\r\f\v]

  • \S 匹配非空白字符,相当于 \t\n\r\f\v

  • \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) 将括号中字符作为一个分组
\num 引用分组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)

 

posted @ 2020-04-22 22:46  醉魔君  阅读(651)  评论(0编辑  收藏  举报