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']

 

posted @ 2018-05-15 00:08  q1ang  阅读(1241)  评论(0编辑  收藏  举报