如何安全地截断带引号的字符串?

时间:2018-12-30 09:43:14

标签: python urllib

我有以下字符串:

Customer sale 88% in urm 50

urllib.parse.quote引用,它变为:

Customer%20sale%2088%25%20in%20urm%2050%27

然后我需要将其长度限制为最多30个字符,并使用value[:30]

问题在于它变成"Customer%20sale%2088%25%20in%"无效:
最后一个%是带引号的字符串中%20的一部分,并使其成为无效的带引号的字符串。

我无法控制原始字符串,最终结果需要最大30个长度,因此我无法事先截断它。

哪种方法可行?

4 个答案:

答案 0 :(得分:4)

urllib.quote使用RFC 3986中定义的百分比编码。这意味着编码字符将始终为"%" HEXDIG HEXDIG形式。

因此,您只需在最后两个字符中查找一个%符号,就可以删除任何结尾的编码。

例如:

>>> s=quote("Customer sale 88% in urm 50")[:30]
>>> n=s.find('%', -2)
>>> s if n < 0 else s[:n]
'Customer%20sale%2088%25%20in'

答案 1 :(得分:1)

寻找悬挂的百分号怎么办?

value = value[:30]
if value[-1] == "%":
    value = value[:-1]
elif value[-2] == "%":
    value = value[:-2]
print(value)

答案 2 :(得分:0)

编码后的字符串将始终为%HH格式。您希望使用有效编码的字符串长度最大为30个字符。因此,可能是我能想到的最佳解决方案:

from urllib.parse import quote
string= "Customer sale 88% in urm 50"
string=quote(string)
string=string[:string[:30].rfind("%")]
print(string)

输出:

string=string[:string[:30].rfind("%")]

解决方案:

编码后,您可能会得到任意长度的字符串,下面的一行代码足以以一种非常优化的方式满足您的要求。

 string=string[:string[:30].rfind("%")]

说明:

它首先从30 characters中提取quoted string,然后从右端搜索%%从右端开始的位置将用于提取字符串。瞧!您得到了结果。

替代方法:

您也可以像这样string=string[:string[:30].rfind("%")]

来代替string=string[:string.rfind("%",0,30)]

注意:我提取了字符串并将其存储回去以展示其工作原理,如果您不想存储,则可以简单地使用print(string[:string[:30].rfind("%")])来显示结果

enter image description here

希望有帮助...

答案 3 :(得分:0)

如何将单个字符放在列表中然后计数并去除? 粗略的例子:

from urllib import quote

s = 'Customer sale 88% in urm 50'

res = []
for c in s:
    res.append(quote(c))

print res # ['C', 'u', 's', 't', 'o', 'm', 'e', 'r', '%20', 's', 'a', 'l', 'e', '%20', '8', '8', '%25', '%20', 'i', 'n', '%20', 'u', 'r', 'm', '%20', '5', '0']
print len(res)

current_length = 0
for item in res:
    current_length += len(item)

print current_length # 39

while current_length > 30:
    res = res[:-1]
    current_length = 0
    for item in res:
        current_length += len(item)

print "".join(res) # Customer%20sale%2088%25%20in

这样,您将最终不会在引号字符的中间切入。并且如果将来需要不同的长度,则只需修改while循环。好吧,代码也可以变得更加干净;)