【问题标题】:replacing all instances of %X with Xth argument in args in python用python中args中的第X个参数替换所有%X实例
【发布时间】:2018-06-29 14:32:00
【问题描述】:

我目前正在尝试用字符串中的第 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"。未达到所需的输出。错误是什么?有没有办法使用替换方法来做到这一点? 提前致谢。

【问题讨论】:

  • 我认为在您的示例中,0 被视为 str 而不是 int,您应该验证 x 是否属于 [0-9] 然后将其转换为 int
  • 会检查的。非常感谢!!

标签: python replace isinstance


【解决方案1】:

这是一种更基本的 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)在字符串s中查找所有%0%2%1

对于每个匹配项,使用re.sub() 替换来自replacements 的相应字符串。遍历所有要替换的匹配项。

【讨论】:

  • 谢谢!!但是不能用replace方法来完成吗?
  • 如果您只是替换 % 符号而不是其他任何东西,那么可以确定。但是,从您的 OP 看来,您有兴趣让替换依赖于 % 符号之后的 int。在这种情况下,使用re.sub() 来指定您感兴趣的模式更为有利。
【解决方案2】:

您当前的方法有问题,因为x 将始终键入str,因此isinstance 检查将始终为False。另外,即使您修复了这个问题,您的代码也会将每个 单个 数字替换为其在 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

【讨论】:

  • 本意不是写自己的格式,不回退到内置方法吗?
  • 谢谢!!但我是初学者。所以如果我在没有任何复杂的东西的情况下这样做会更好。除了使用正则表达式之外还有其他方法吗
  • @dashiell 我没有看到 OP 提到这一点
猜你喜欢
  • 2018-01-20
  • 2015-10-04
  • 2011-08-27
  • 2018-06-24
  • 2012-06-13
  • 2015-11-07
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多