命名分组
import re strvar = "<div>123456</div>" lst = re.findall(r"<(.*?)>(.*?)<(.*?)>",strvar)=> ['div','123456','/div'] # 1.反向引用 # \1代表反向引用,将第一个括号匹配的字符串,在\1位置处再引用一次 lst = re.findall(r"<(.*?)>(.*?)<(/\1)>",strvar)=> ['div','123456','/div'] strvar = "a1b2cab" re.search(r"(.*?)\d(.*?)\d(.*?)\1\2",strvar) # 2.命名分组(给小组命名) 语法:(?P<组名>正则表达式)给这个组起一个名字 (?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置 strvar = "a1b2cab" re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(.*?)\1\2",strvar) re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(.*?)(?P=tag1)(?P=tag2)",strvar) 6正则函数findall()
search() 通过正则匹配出第一个对象就返回,通过group去除对象中的值,groups把括号里匹配到的内容丢到元组中返回
match() search只要在正则表达式的前面加上^ 就和match一样
split() 切割
import re strvar = "alex|xboy&wusir-egon" re.split("[|&-]",strvar)#alex xboy wusir egon strvar = "alex242141xboy232523wusir1215egon" re.split("[\d+]",strvar)#alex xboy wusir egon " "sub() 替换(正则表达式,替换的字符串,原字符串,[可选的替换次数})
import re strvar = "alex|xboy&wusir-egon" re.sub("[|&-]","%",strvar)# "alex%xboy%wusir%egon" # 替换一次 re.sub("[|&-]","%",strvar)# re.sub("[|&-]","%",strvar,1)# "alex%xboy&wusir-egon"subn() 替换 与sub用法一样,区别在于返回值不同,返回的是元组
import re strvar = "alex|xboy&wusir-egon" re.sub("[|&-]","%",strvar)# "alex%xboy%wusir%egon",3 # 替换一次 re.sub("[|&-]","%",strvar)# re.sub("[|&-]","%",strvar,1)# "alex%xboy&wusir-egon",1finditer 匹配字符串中的相应内容,返回迭代器
from collections import Iterator strvar = "safadsadsadas你好23342" it = re.finditar(r"\d+",strvar) isinstance(it,Iterabor) for i in it: i.group()compile 指定一个统一的匹配规则
正常情况下,正则表达式执行一次,编译一次 如果反复使用,会浪费系统资源,比如内存,cpu compile 可以使正则编译一次,无序反复编译 strvar = "safadsadsaddsad155as你好23342" pattern = re.compile(r"\d+")# re.compile('\\d+')返回的是对象 obj = pattern.search(strvar) obj.group()#155 lst = pattern.findall(strvar)# ["155","23342"]正则表达式修饰符 配合compile使用
re.I 使匹配对大小写不敏感
strvar = "<h1>123</H1>" pattern = re.compile("<h1>.*?</h1>",flag=re.I) pattern.search(strvar).group() # 123re.M 使每一行都能单独匹配(多行匹配),影响^ $的使用
strvar = """<h1>123</H1> <p>123</p> <div>123</div> """ pattern = re.compile("^<.*?>(.*?)<.*?>$") # 因为 pattern.findall(strvar) # [] # 使用re.M pattern = re.compile("^<.*?>(.*?)<.*?>$",flag=re.M) pattern.findall(strvar) # 123 123 123re.S 使.匹配包含换行在内的所有内容
strvar ="""give 112233mefive """ pattern = recompile("(.*?)mefive") # 因为.匹配不到\n换行符 pattern.search(strvar).group()# 112233mefive # 使用re.S 完善. pattern = recompile("(.*?)mefive",flags=re.S) pattern.search(strvar).group()# "give \n 112233mefive"