展平表达式算法

时间:2014-09-25 13:45:34

标签: python string dictionary

我找不到任何好的算法来压缩dict中给出的值。我的表达式是带有'变量的字符串'。每个变量可以是数字或另一个变量,即: 我的字面是

map = {
    'a': 4,
    'b': 6,
    'c': 'a+b',
    'd': 'c+a+4'
}

和表达式可以是这样的:

first = 'a + b' # result should be: '4 + 6'

secound = 'd PLUS c' # result '4+6+4+4 PLUS 4+6'

我不想评估这个结果。我想知道如何用实数(来自地图字典)替换(展平?)这样的变量

1 个答案:

答案 0 :(得分:2)

使用正则表达式替换(re.subRegexpObject.sub,它不仅接受替换字符串,还接受替换函数作为第二个参数):

import re

def flatten(expression, mapping):
    pattern = re.compile('|'.join(map(re.escape, mapping)))
    while pattern.search(expression):
        expression = pattern.sub(lambda m: mapping[m.group()], expression)
    return expression

mapping = {
    'a': 4,
    'b': 6,
    'c': 'a+b',
    'd': 'c+a+4'
}

# Convert all values to strings.
mapping = {key: str(mapping[key]) for key in mapping}

用法:

>>> flatten('a + b', mapping)
'4 + 6'
>>> flatten('d PLUS c', mapping)
'4+6+4+4 PLUS 4+6'
顺便说一句,不要使用map作为变量名。它会影响内置函数map