python正则表达re模块使用
1、match
从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。
2、search
re.search(pattern, string[, flags])
若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个。
3、findall
re.findall(pattern, string[, flags])
返回string中所有与pattern相匹配的全部字串,返回形式为数组。
4、finditer
re.finditer(pattern, string[, flags])
返回string中所有与pattern相匹配的全部字串,返回形式为迭代器。
以下代码功能为,找出所有smali方法的函数名:
f= open(fulpath,"rb")#fulpath为smali路径 buf = f.read() f.close() pattern =re.compile(r".method.+ (.+?)(.+)")#这里不带flag表示 .不匹配新行 m = None m=re.findall(pattern, buf) if None!=m: print m#打印所有匹配函数
打印找到所有函数名:
默认findall这里打印的是
(.+?)匹配的数据,如果想打印出其它的信息可以换成finditer,以下代码与上面相同
m=re.finditer(pattern, buf) for i in m: print i.group(1)
math对象group方法可以取正则表达式中的原子
group()与group(0)都表示取整个表达内容
正则中每个()中表示一个原子
re.sub用法
sub(pattern, repl, string, count=0, flags=0)
repl 这个参数可以是字符串,也可以是回调函数,下面例子是回调函数情况
#找到文件中onCreate中方法,传到
rel中处理
buf =open(actfpath,"r").read() pt=re.compile("onCreate(.+?)(.end method)",re.DOTALL) buf =re.sub(pt,rel,buf) #----正则回调,插入smali代码 def rel(m): """""" smali=" invoke-virtual {p0}, Lorg/dogs/baidusdcardService;- " buf = m.group() endbuf =".end method" newend = smali+" "+endbuf buf = buf.replace(endbuf,newend) return buf
纯手工,原创