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

2024-06-25 22:53:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串,我想把一个变量放在多个地方:

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\u 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

有什么办法让它起作用吗?你知道吗


Tags: refbyexistsnotorderfilterwherequery
2条回答

另外,当使用%符号进行字符串格式设置时,可以指定如下关键字参数(取自您的示例):

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。WIt只插入变量的字符串表示形式。还有其他选项,比如%c-字符、%d-数字等等。 除此之外,它还支持关键字参数。这意味着,当您将dictionary作为格式化源传递时,可以为%操作符指定给定dict的键,如下所示:

d = {'one': 'first param', 'two': 'second param'}
print 'Few options here: %(one)s and %(two)s' % d

%(one)s意思是:通过键one从dict中获取值,并放入其字符串表示形式(%s)。相同的规则适用于所有参数。如果您只想使用%(one),这将不起作用,因为您需要提供type,在这个%s中,type代表字符串。你知道吗

尽管有关于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'

相关问题 更多 >