Python: как заменить числовые значения в строке их соответствующими данными в словаре - PullRequest
2 голосов
/ 06 ноября 2019

У меня есть логическое выражение вроде:

    expression = '(1 & 2) & 3'
    and a dictionary as, x = {1: '1', 2: '0', 3: '0'} 
    --- keys can be int or string, manageable

Мне нужно оценить эту строку как,

    '(1 & 2) & 3' 
    => '(x[1] & x[2]) & x[3]'
    => '(1 & 0) & 0'
    => eval('(1 & 0) & 0') = 0

В настоящее время я делаю это так:

    re.sub('(\d+)', r'x[\1]', expression)
    => '(x[1] & x[2]) & x[3]'
    but can't run eval on this

или

    re.sub('(\d+)', eval(r'x[\1]'), expression)
    => eval(x[\1]) --> logical error 

Пожалуйста, поделитесь эффективным решением для достижения этой цели. Приложение может определять различные выражения, и одно выражение используется для оценки тысяч словарей, таких как x.

Ответы [ 2 ]

4 голосов
/ 06 ноября 2019

Что вы можете сделать, это определить функцию lambda в качестве замены и поиск в словаре для каждого соответствия:

import re

expression = '(1 & 2) & 3'
d = {1: '1', 2: '0', 3: '0'} 

res = re.sub('(\d+)', lambda x: d[int(x.group(1))], expression)
#'(1 & 0) & 0'

eval(res)
# 0

Если выражение может содержать целые числа, которых нет в словаре, вы можете адаптировать что-то вроде:

res = re.sub('(\d+)', lambda x: d.get(int(x.group(1)), '0'), expression)
0 голосов
/ 08 ноября 2019

Incase это помогает. без регулярных выражений

def complement_n(expression):
    expression_dict = {'1': '1','2': '0', '3': '0', '&':'&','(':'(',')':')',' ': ' '
    #expression_dict = dict(a='t', c='g', t='a', g='c'),
                      }
    comp_string = ''
    for base in expression:
        comp_string += expression_dict[base]
        ##comp_string += dna_complement.get(base, 'some_value')
    return comp_string

expression = '(1 & 2 ) & 3'
comp_string = complement_n(expression)
print ("Complement is:", comp_string)
...