замена всех экземпляров% X аргументом X в аргументах в python - PullRequest
0 голосов
/ 29 июня 2018

В настоящее время я пытаюсь заменить вхождение числа x аргументом x в строке. Вот мой код:

def simple_format(format, *args):
    res = format.replace("%", "")
    for x in res:
        if (isinstance(x, int)):
            res = res.replace(x, args(x))
     return res

Первая замена используется для удаления вхождения % в строке, а следующая - проверка, является ли найденная переменная числом, и если это так, то замена ее аргументом.

Например, simple_format("hello %0", "world", "Ben") должно вернуть "hello world". Желаемый результат не достигнут. В чем ошибка? Есть ли способ сделать это с помощью метода замены? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вот более базовый подход IMO, и, вероятно, более читабельный:

import re

s = 'hello %0, how %2 do you come to %1?'

replacements = ['world','stack overflow','often']

for match in re.findall(r'\%[0-9]+', s):
    s = re.sub(match, replacements[int(re.sub(r'\%','',match))], s)

Выход:

'hello world, how often do you come to stack overflow?'

Пояснение:

re.findall(r'\%[0-9]+', s) находит все %0, %2, %1 и т. Д. В строке s

Для каждого из этих совпадений используйте re.sub() для замены в соответствующей строке из replacements. Переберите все совпадения, которые необходимо заменить.

0 голосов
/ 29 июня 2018

Ваш текущий подход содержит ошибки, так как x всегда будет иметь тип str, поэтому проверка isinstance всегда будет ложной. Кроме того, даже если вы исправите это, ваш код будет заменять каждую одну цифру на ее индекс в args (при условии, что вы также измените args(x) на args[x]).

Я бы использовал подстановку регулярных выражений для преобразования вашей строки в правильный форматный литерал. Затем вы можете использовать строковый формат для вставки аргументов.

import re
def simple_format(format, *args):
    new = re.sub(r"%(\d+)", r"{\1}", format)
    return new.format(*args)

print(simple_format("hello %0", "world", "Ben"))
# hello world
...