我有以下字符串:
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个长度,因此我无法事先截断它。
哪种方法可行?
答案 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("%")])
来显示结果
希望有帮助...
答案 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循环。好吧,代码也可以变得更加干净;)