Python入门学习(七)高级部分:正则表达式(二)
一、re.sub正则替换
import re language = "PythonC#JavaC#PHPC#JavaC#" #re.sub方法用来替换字符 #最后一个参数1表示替换第一个 r1 = re.sub("C#", "GO", language, 1) print(r1) #最后一个参数0表示无限制替换下去 r2 = re.sub("C#", "GO", language, 0) print(r2) #传统字符串replace方法其实不是替换,而是新建 language1 = language.replace("C#", "GOO") print(language,"\n", language1)
re.sub()方法还有一个重要的用法就是第二个参数可以是函数
import re language = "PythonC#JavaC#PHPC#Java" def convert(value): #当正则匹配的给该函数传参时,value实则是一个对象 #需要用group()方法提取其值 matched = value.group() print(matched) return "!!" + matched +"!!" #当函数名作为sub()第二个参数时,将把第一个参数作为该函数的参数,再把函数返回值去替换 r = re.sub("C#", convert, language) print(r)
import re s = "A8C3721D86" #要找出s中所有大于等于6的数字,全部替换为9 #小于6的数字,全部替换为0 def convert(value): matched = value.group() if int(matched) >=6: return "9" else: return "0" r = re.sub("\d", convert, s) print(r) s1 = "A83C27D1D8E67" #如果需要以连续两位数字作为一个整体 #如大于50的,替换为100 #小于50的,替换为0 #如只有一位数,则删除 def myconvert(value): matched = int(value.group()) print(matched) if matched >= 50: return "100" elif matched > 9: return "0" else: return "" r = re.sub("\d{1,2}", myconvert, s1) print(r)
二、match和search方法
import re s = "83C72D1D8E67" r0 = re.findall("\d", s) print(r0) #正则的match和serach方法使用基本和findall一致 #他们和findall最大的区别在于他们只匹配一次就结束 #match尝试从字符串首字符匹配 #其返回结果是一个对象 r1 = re.match("\d", s) print(r1.group()) #span可以获取字符的位置 print(r1.span()) #search则是搜索,一旦搜索到则匹配到 r2 = re.search("\d", s) print(r2.group()) print(r2.span())
关于group()方法
import re s = "life is short, i use python!" #要求提取life 和 python之间的字符 #首先需要定界:通过首尾定好life和python #中间通过"."来匹配所有非换行符的字符(因为这里中间除了字母还有空格符) #因为中间字符数量不确定,所以在"."后面加上*表示任意多个 r = re.search("life.*python", s) print(r.group()) #但是上述输出还是包含了life和python这些定界标签字符 #上述life.*python虽然没有显式采用括号,其实就是一个组 #所以用group()还是会整体输出 #如下的方式将".*"括起来,则变成了内部的分组 r1 = re.search("life(.*)python", s) #group(0)永远都是指定的整体 print(r1.group(0)) #可以通过group(1)去指定 print(r1.group(1)) #再通过下面这个例子加深理解 s1 = "lifeisshortiusepython" r2 = re.search("is(\w*)use(p\w*n)", s1) #获取整体,也可以通过group() print(r2.group(0)) #获取内部第一个分组(\w*) print(r2.group(1)) #获取内部第二个分组(p\w*n) print(r2.group(2))
实际上,再比较一下findall实现上述功能的用法,更为简单
r_f1 = re.findall("life(.*)python", s) r_f2 = re.findall("is(\w*)use(p\w*n)", s1) print(r_f1) print(r_f1[0]) print(r_f2) print(r_f2[0][0]) print(r_f2[0][1])
import re s = "life is short, i use python, i love python" #要求找到life和python之间的字符,以及python和python之间的字符 r = re.search("life(.*)python(.*)python", s) print(r.group()) #整体 print(r.group(1)) #第一个分组 print(r.group(2)) #第二个分组 #也可以如下方式,会以元组形式输出 print(r.group(0,1,2)) #groups()直接返回整体中间的各个分组 print(r.groups()) print(r.groups()[0]) print(r.groups()[1]) #同样的用findall实现如下 r1 = re.findall("life(.*)python(.*)python", s) print(r1[0][0], "\n", r1[0][1])
浙公网安备 33010602011771号