替换字符串中多个位置的变量

时间:2015-08-03 13:20:56

标签: python string formatting

我有一个字符串,我想将一个变量放在其中的多个位置:

query_1 ='SELECT distinct ?a\
        WHERE { ?a rno:end_at ?b.\
        ?b rdf:type rno:Node; rno:is_extent_of ?x.\
        ?x rno:builds %s. %s a rno:Roundabout.\
        FILTER(NOT EXISTS {?a rno:builds %s})} ORDER BY ?a'%(ref_RaURI, ref_RaURI,ref_RaURI)
    print query_1

以上替换工作,但我不想重复变量ref_RaURI,所以我尝试了以下内容:

query_1 ='SELECT distinct ?a\
        WHERE { ?a rno:end_at ?b.\
        ?b rdf:type rno:Node; rno:is_extent_of ?x.\
        ?x rno:builds {0}. {0} a rno:Roundabout.\
        FILTER(NOT EXISTS {?a rno:builds {0}})} ORDER BY ?a'.format(ref_RaURI)
    print query_1

这个人正在回归:

    FILTER(NOT EXISTS {?a rno:builds {0}})} ORDER BY ?a'.format(ref_RaURI)
KeyError: ' ?a rno'

使用字典:

        query_1 ="SELECT distinct ?a\
        WHERE { ?a rno:end_at ?b.\
        ?b rdf:type rno:Node; rno:is_extent_of ?x.\
        ?x rno:builds %(s). %(s) a rno:Roundabout.\
        FILTER(NOT EXISTS {?a rno:builds %(s)})} ORDER BY ?a"%{'s':ref_RaURI}
    print query_1

返回:

    FILTER(NOT EXISTS {?a rno:builds %(s)})} ORDER BY ?a"%{'s':ref_RaURI}
ValueError: unsupported format character ' ' (0x20) at index 140

有没有办法让它发挥作用?

2 个答案:

答案 0 :(得分:1)

尽管有关SQLInjection的评论,但在一般情况下,您可以像string.format()一样使用命名参数:

>>> "Hello {myname} multi {myname} variable {myname}".format(myname="Tom")
'Hello Tom multi Tom variable Tom'

您还可以在不同的地方使用不同的格式:

>>> "0dp {v:.0f} 3dp {v:.3}".format(v=1.23)
'0dp 1 3dp 1.23'

答案 1 :(得分:1)

此外,当使用Gradle &Restart Project符号进行字符串格式化时,您可以像这样指定关键字参数(从您的示例中获取):

%

字符串格式化运算符pattern ='SELECT distinct ?a\ WHERE { ?a rno:end_at ?b.\ ?b rdf:type rno:Node; rno:is_extent_of ?x.\ ?x rno:builds %(p1)s. %(p1)s a rno:Roundabout.\ FILTER(NOT EXISTS {?a rno:builds %(p1)s})} ORDER BY ?a' params = dict(p1=ref_RaURI) # equal to # params = {'p1': ref_RaURI} query_1 = pattern % params 有多个选项。最常见的情况是将其用作%。只是插入变量的字符串表示。还有其他选项,例如%s - 字符,%c - 数字等。 除此之外,它还支持关键字参数。这意味着,当您将字典作为格式化源传递时,您可以为%d运算符指定给定字典的键,如下所示:

%

d = {'one': 'first param', 'two': 'second param'} print 'Few options here: %(one)s and %(two)s' % d 表示:通过键%(one)s获取dict中的值,并将其字符串表示形式(one)。同样的规则适用于所有参数。如果你只想使用%s,这将不起作用,因为你需要提供类型,应该打印哪个值,在%(one)代表字符串。