鱼C论坛

 找回密码
 立即注册
查看: 2334|回复: 6

运用正则表达式遇到的一点问题,求指点

[复制链接]
发表于 2017-5-3 13:04:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import re
data = "1 - 2 * ( (60-30 +(9-2*5/3 + 7 /3*99/4*2998 +10*568/14 )*(-40/5)) - (-4*3)/ (16-3*2) )"
s = re.search("[-+]*[0-9]+\.*[0-9]*\*[-+]*[0-9]+\.*[0-9]*",data)
print(s.group())
print(type(s.group()))
m=re.sub(s.group(),"|",data,count=1 )
print(m)


这是简化的代码,我想通过正则表达式先找出乘法运算,然后用结果数据替换匹配到的数据,但是这里我用的m=re.sub(s.group(),"|",data,count=1 )
这句代码实现不了,麻烦大家指点下该怎么改,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-3 13:54:09 | 显示全部楼层
本帖最后由 gopythoner 于 2017-5-3 14:23 编辑

你要的是这个结果?
['-2*5', '3*99', '4*2998', '+10*568', '-4*3', '-3*2']

只需要
s = re.findall("[-+]*[0-9]+\.*[0-9]*\*[-+]*[0-9]+\.*[0-9]*",data)
print(s)
或者这样
s = re.findall("\d+\*\d+",data)
得到['2*5', '3*99', '4*2998', '10*568', '4*3', '3*2']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-3 15:06:09 | 显示全部楼层
>>> import ast
>>> exp = "1 - 2 * ( (60-30 +(9-2*5/3 + 7 /3*99/4*2998 +10*568/14 )*(-40/5)) - (-4*3)/ (16-3*2) )"
>>> ast.dump(ast.parse(exp,'<string>','eval'))
'Expression(body=BinOp(left=Num(n=1), op=Sub(), right=BinOp(left=Num(n=2), op=Mult(), right=BinOp(left=BinOp(left=BinOp(left=Num(n=60), op=Sub(), right=Num(n=30)), op=Add(), right=BinOp(left=BinOp(left=BinOp(left=BinOp(left=Num(n=9), op=Sub(), right=BinOp(left=BinOp(left=Num(n=2), op=Mult(), right=Num(n=5)), op=Div(), right=Num(n=3))), op=Add(), right=BinOp(left=BinOp(left=BinOp(left=BinOp(left=Num(n=7), op=Div(), right=Num(n=3)), op=Mult(), right=Num(n=99)), op=Div(), right=Num(n=4)), op=Mult(), right=Num(n=2998))), op=Add(), right=BinOp(left=BinOp(left=Num(n=10), op=Mult(), right=Num(n=568)), op=Div(), right=Num(n=14))), op=Mult(), right=BinOp(left=UnaryOp(op=USub(), operand=Num(n=40)), op=Div(), right=Num(n=5)))), op=Sub(), right=BinOp(left=BinOp(left=UnaryOp(op=USub(), operand=Num(n=4)), op=Mult(), right=Num(n=3)), op=Div(), right=BinOp(left=Num(n=16), op=Sub(), right=BinOp(left=Num(n=3), op=Mult(), right=Num(n=2))))))))'
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-3 20:22:38 | 显示全部楼层
gopythoner 发表于 2017-5-3 13:54
你要的是这个结果?

只需要

不是我想要的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-3 20:23:41 | 显示全部楼层

学习中,不想用eval
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-3 21:27:23 | 显示全部楼层
wwsw0105 发表于 2017-5-3 20:23
学习中,不想用eval

这是表达式语法解析式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-3 21:31:42 | 显示全部楼层
>>> exp = "1 - 2 * ( (60-30 +(9-2*5/3 + 7 /3*99/4*2998 +10*568/14 )*(-40/5)) - (-4*3)/ (16-3*2) )"
>>> import re, ast
>>> s=ast.dump(ast.parse(exp,'<string>','eval'))
>>> num=re.compile(r'Num\(n=(\d+)\)')
>>> delete=re.compile(r'(?:(?:body|left|right|op(?:erand)?)=)|(?:(?:Unary|Bin)Op)|Expression')
>>> retval=num.sub(r'\1',delete.sub('',s))
>>> opr={'USub()':'-', 'Sub()':'-', 'Mult()':'*', 'Add()':'+', 'Div()':'/',', ':''}
>>> for k,v in opr.items():
        retval = retval.replace(k,v)

        
>>> print(retval)
((1-(2*(((60-30)+((((9-((2*5)/3))+((((7/3)*99)/4)*2998))+((10*568)/14))*((-40)/5)))-(((-4)*3)/(16-(3*2)))))))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表