re.findall()正则表达式中括号的坑
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+\s\w+',a)) print(re.findall('(\w+)\s\w+',a)) print(re.findall('((\w+)\s\w+)',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']