thisissifumwike
thisissifumwike

Reputation: 65

Format message by calling a written python function name in string

I have functions

def getName():
   name = "Mark"
   return name

def getDay():
   day = "Tuesday"
   return day

I have a variable

message = "Hi there [getName] today is [getDay]"

I need to check all occurences for the strings between the square brackets in my message variable and check whether that name is a function that exists so that I can evaluate the value returned by the function and finally come up with a new message string as follows

message = "Hi there Mark, today is Tuesday

Upvotes: 0

Views: 603

Answers (4)

Adon Bilivit
Adon Bilivit

Reputation: 27196

f-strings are the way to go on this but that wasn't the question. You could do it like this but I wouldn't advise it:

import re

def getName():
    return 'Mark'

def getDay():
    return 'Tuesday'

msg = "Hi there [getName] today is [getDay]"

for word in re.findall(r'\[.*?\]', msg):
    try:
        msg = msg.replace(word, globals()[word[1:-1]]())
    except (KeyError, TypeError):
        pass

print(msg)

Output:

Hi there Mark today is Tuesday

Upvotes: 1

Devang Sanghani
Devang Sanghani

Reputation: 780

import re

message = "Hi there [getName] today is [getDay]"
b = re.findall(r'\[.*?\]',message)
s=[]
for i in b:
    s.append(i.strip('[]'))
print(s)

Output:

['getName', 'getDay']

Upvotes: 0

Mous
Mous

Reputation: 1047

There is another way of achieving this if you specifically want to use the string in that format. However, fstrings as shown in the above answer are a much superior alternative.

def f(message):
    returned_value=''
    m_copy=message
    while True:
        if '[' in m_copy:
            returned_value+=m_copy[:m_copy.index('[')]
            returned_value+=globals()[m_copy[m_copy.index('[')+1:m_copy.index(']')]]()
            m_copy=m_copy[m_copy.index(']')+1:]
        else:
            return returned_value+m_copy

Upvotes: 1

zeeshan12396
zeeshan12396

Reputation: 412

print(f"Hi there {getName()} today is {getDay()}")

Upvotes: 2

Related Questions