import re # 7/ 3* 99/ 4* 2998 # +d[*/] # 2* 5/ 3 content='1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))+(2+3*2) ' zzz=re.compile('(d+[*/])+d+') a1=zzz.findall(content) print(a1) a2=zzz.search(content).group() print(a2) a3=re.search('(d+[*/]){4}d+',content).group() print(a3) a4=re.findall('(d+[*/]){4}d+',content) print(a4) >>> ['40/', '5/', '4*', '568/', '4*', '3*', '3*'] 40/5 7/3*99/4*2998 ['4*']
在用re写计算器的时候发现findall和search在相同的正则表达式下得到的结果大不相同(尽管search只匹配第一个结果)
发现findall在正则表达式有括号和没有括号的情况下,结果不同
a='q1ang q2ang q3ang q4ang' print(re.findall('w+sw+',a)) print(re.findall('(w+)sw+',a)) print(re.findall('((w+)sw+)',a)) >>> ['q1ang q2ang', 'q3ang q4ang'] ['q1ang', 'q3ang'] [('q1ang q2ang', 'q1ang'), ('q3ang q4ang', 'q3ang')]
在正则表达式有一个括号的时候,仅仅匹配括号内的内容
当有两个括号时,它会分别匹配括号由内向外的内容,经结果存在元组中再给列表
找到一个解决办法,用(?:re)的方法来去除组
content='1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))+(2+3*2) ' # zzz=re.compile('(?:d+[*/])+d+') a1=zzz.findall(content) print(a1) >>> ['40/5', '2*5/3', '7/3*99/4*2998', '10*568/14', '4*3', '3*2', '3*2']