如何使用roundUp(...)
(或其他衍生产品)从以下可能的排列中提取regex
:
[[[ roundUp( 10.0 ) ]]]
[[[ roundUp( 10.0 + 2.0 ) ]]]
[[[ roundUp( (10.0 * 2.0) + 2.0 ) ]]]
[[[ 10.0 + roundUp( (10.0 * 2.0) + 2.0 ) ]]]
[[[ 10.0 + roundUp( (10.0 * 2.0) + 2.0 ) + 20.0 ]]]
我问的原因是我想在我的代码中用roundUp(...)
替换math.ceil((...)*100)/100.0
但我不确定怎么做,因为多次使用机会括号帮助运算符优先级
答案 0 :(得分:5)
这是python,为什么不重新绑定名称roundUp
:
def my_roundup(x):
return math.ceil(x*100)/100.
roundUp = my_roundup
答案 1 :(得分:1)
您无法使用正则表达式解决一般情况。正则表达式的功能不足以表示类似于堆栈的任何内容,例如嵌套到任意深度的括号或XML标记。
如果您要解决 python中的问题,可以执行类似
的操作import re
def roundup_sub(m):
close_paren_index = None
level = 1
for i, c in enumerate(m.group(1)):
if c == ')':
level -= 1
if level == 0:
close_paren_index = i
break
if c == '(':
level += 1
if close_paren_index is None:
raise ValueError("Unclosed roundUp()")
return 'math.ceil((' + m.group(1)[1:close_paren_index] + ')*100)/100.0' + \
m.group(1)[close_paren_index:] # matching ')' and everything after
def replace_every_roundup(text):
while True:
new_text = re.sub(r'(?ms)roundUp\((.*)', roundup_sub, text)
if new_text == text:
return text
text = new_text
这使用re.sub的repl = function形式,并使用正则表达式来查找与括号匹配的开头和python,并决定在何处结束替换。
使用它们的一个例子:
my_text = """[[[ roundUp( 10.0 ) ]]]
[[[ roundUp( 10.0 + 2.0 ) ]]]
[[[ roundUp( (10.0 * 2.0) + 2.0 ) ]]]
[[[ 10.0 + roundUp( (10.0 * 2.0) + 2.0 ) ]]]
[[[ 10.0 + roundUp( (10.0 * 2.0) + 2.0 ) + 20.0 ]]]"""
print replace_every_roundup(my_text)
为您提供输出
[[[ math.ceil((10.0 )*100)/100.0) ]]]
[[[ math.ceil((10.0 + 2.0 )*100)/100.0) ]]]
[[[ math.ceil(((10.0 * 2.0) + 2.0 )*100)/100.0) ]]]
[[[ 10.0 + math.ceil(((10.0 * 2.0) + 2.0 )*100)/100.0) ]]]
[[[ 10.0 + math.ceil(((10.0 * 2.0) + 2.0 )*100)/100.0) + 20.0 ]]]
另一种选择是实现一个处理一定深度嵌套括号的正则表达式。