鱼C论坛

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

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

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

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

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

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



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

使用道具 举报

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

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


只需要
  1. s = re.findall("[-+]*[0-9]+\.*[0-9]*\*[-+]*[0-9]+\.*[0-9]*",data)
  2. print(s)
复制代码

或者这样
  1. s = re.findall("\d+\*\d+",data)
  2. 得到['2*5', '3*99', '4*2998', '10*568', '4*3', '3*2']
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-3 15:06:09 | 显示全部楼层
  1. >>> import ast
  2. >>> exp = "1 - 2 * ( (60-30 +(9-2*5/3 + 7 /3*99/4*2998 +10*568/14 )*(-40/5)) - (-4*3)/ (16-3*2) )"
  3. >>> ast.dump(ast.parse(exp,'<string>','eval'))
  4. '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))))))))'
  5. >>>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

只需要

不是我想要的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

学习中,不想用eval
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这是表达式语法解析式
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  10.        
  11. >>> print(retval)
  12. ((1-(2*(((60-30)+((((9-((2*5)/3))+((((7/3)*99)/4)*2998))+((10*568)/14))*((-40)/5)))-(((-4)*3)/(16-(3*2)))))))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 12:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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