Python-类似于 php 中的 .format()

Python-like .format() in php

我有以下数组:

$matches[0] = "123";
$matches[1] = "987";
$matches[2] = "121";

以及以下字符串:

$result = "My phone number is {0} and police number is {2}";

我想根据 $matches 数组替换 {} 占位符,以防占位符不匹配时显示任何内容。

实现该目标的最佳方法是什么,或者您知道解决我的问题的更好方法吗?

(现在我正在构建系统,所以我可以使用任何其他符号代替大括号)

更新

在 python 中,可以使用 .format() 函数。

您可以使用 vsprintf 来完成,如果您像这样给出项目的编号(从 1 开始),则不必更改项目的顺序:%n$s(其中 n是数字):

$matches = [ "123", "987", "121"];
$result = 'My phone number is %1$s and police number is %3$s';

$res = vsprintf($result, $matches);

请注意,您必须将格式化的字符串放在单引号之间,否则 $s 将被解释为变量并被替换为任何内容。

(vprintfvsprintf 是为数组设计的,但是你可以用 printfsprintf 为分隔变量做同样的事情,它的工作原理相同)


如果你不能改变你原来的Python格式化字符串,方法是使用preg_replace_callback:

$matches = [ "123", "987", "121"];
$result = 'My phone number is {0} and police number is {2}';

$res = preg_replace_callback('~{(\d+)}~', function ($m) use ($matches) {
    return isset($matches[$m[1]]) ? $matches[$m[1]] : $m[0];
}, $result);

或者您可以构建一个关联数组,其中键是占位符,值是您的数组值,并使用 strtr 进行替换:

$matches = [ "123", "987", "121"];
$result = 'My phone number is {0} and police number is {2}';

$trans = array_combine(
    array_map(function ($i) { return '{'.$i.'}'; }, array_keys($matches)),
    $matches
);

$result = strtr($result, $trans);