Python Строковый формат с динамическим c ключом выдает KeyError - PullRequest
1 голос
/ 10 февраля 2020
import re

regex = r"\{(.*?)\}"

v = '2020-01-21'
x = "xdate({date1}, 'mm/dd/yyyy')"

yy = x.format(date1=v)
print(yy) 
#works as expected

m1 = re.search(regex, x)
if m1:
    p1 = m1.group(0)
    #p1 = m1.group(1)    
    print(p1)
    p = x.format(p1=v)
    print(p)  

В приведенной выше программе я могу заставить ее работать, когда печатаю гг , но я не хочу жестко кодировать строковый литерал date1 , я пытаюсь прочитайте строковый литерал и используйте его в format()

Я получаю KeyError: 'date1'. Любые предложения, пожалуйста?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Вы можете использовать позиционный заполнитель {} вместо именованных.

Таким образом, вместо:

x = "xdate({date1}, 'mm/dd/yyyy', {date2}, 'dd/mm/yyyy', {date3}, 'yyyy/mm/dd')"
yy = x.format(date1=v1, date2=v2, date3=v3)

do:

x = "xdate({}, 'mm/dd/yyyy', {}, 'dd/mm/yyyy', {}, 'yyyy/mm/dd')"
yy = x.format(v1, v2, v3)
0 голосов
/ 10 февраля 2020

Поскольку вы уже используете Python 3.7, почему бы не использовать f-strings для форматирования строк. Это возможно более читабельно и немного быстрее.

import re

regex = r"\{(.*?)\}"

v = "2020-01-21"
date1 = v
x = f"xdate({date1}, 'mm/dd/yyyy')"

yy = x
print(yy)

m1 = re.search(regex, x)
if m1:
    p1 = m1.group(0)
    # p1 = m1.group(1)
    print(p1)
    p = x.format(p1=v)
    print(p)

Это печатает,

>> xdate(2020-01-21, 'mm/dd/yyyy')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...