Нахождение имени переменной в строке и затем замена имени переменной на значение переменной - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь найти ссылку на переменную в строке (здесь: переменная - var1)

Я хочу найти {var1} в предложении и заменить его значением для var1 ("testentry1 ")

Ссылаясь на var1, можно задать нужную строку

Однако я не могу сделать то же самое, ссылаясь на var_name

У меня будет номеримен переменных (например, {var1}, {var2}) , которые будут в предложениях, и я хотел бы найти способ подстановки соответствующего слова в строку.

class TestClass:
    def __init__(self):
        self.var1 = "testentry1"
        self.var2 = "testentry2"


    def convert_text(self, original_text):
        #find the variable name of interest (here: {var1})
        found_text = re.findall('\{([^{}]*)\}', original_text)
        var_name = found_text[0]
        #replace {var1} with the value for var1
        search_str = "{"+var_name+"}"
        new_text = original_text.replace(search_str, self.var_name)
        new_text2 = original_text.replace(search_str, self.var1)

        print("output1 is (not desired result):", new_text)
        print("output2 is (desired result):", new_text2)
        return new_text2

TC = TestClass()



TC.convert_text("this is the text to change {var1}")
TC.convert_text("this is the text to change {var2}")

1 Ответ

2 голосов
/ 21 марта 2019

Этот материал встроен в python:

var1 = "testentry1"
print("this is the text to change {var1}".format(**locals()))

Обратите внимание, что для переноса контекста обычно лучше использовать словарь, а не голые переменные.

Если ваши строки статичны (то есть вы используете их в контексте, где все переменные известны заранее), вы можете просто добавить строку с f (python 3.6 +):

var1 = "testentry1"
print(f"this is the text to change {var1}")

Если вы действительно хотите заново изобретать колеса, вы можете сделать то же самое с re:

def my_format(s, vars):
    return re.sub(r'{(\w+)}', lambda m: vars[m.group(1)], s)


print(my_format("this is the text to change {var1}", locals()))

«Автоматическая» замена вне контекста (нелокальные) переменные также возможна, но очень хакерским способом:

# do NOT do that!

import re
import sys

var1 = "testentry1"


def my_format2(s):
    return re.sub(r'{(\w+)}', lambda m: eval(m.group(1)), s)


def get_var(name):
    f = sys._getframe()
    while f:
        if name in f.f_locals:
            return f.f_locals[name]
        f = f.f_back


def my_format3(s):
    return re.sub(r'{(\w+)}', lambda m: get_var(m.group(1)), s)


print(my_format2("this is the text to change {var1}"))
print(my_format3("this is the text to change {var1}"))

В ответ на ваше обновление легко использовать format с классом dict:

class TestClass:
    def __init__(self):
        self.var1 = "testentry1"
        self.var2 = "testentry2"

    def convert_text(self, original_text):
        return original_text.format(**vars(self))


TC = TestClass()

print(TC.convert_text("this is the text to change {var1}"))
print(TC.convert_text("this is the text to change {var2}"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...