在字符串中插入引号的最佳pythonic方法

2024-09-28 03:12:07 发布

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

我在编写自己的反向代理时处理this python bug。服务器正在向我的代理发送此Set-Cookie响应头:

workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires=Sun, 02-Dec-2012 5:57:25 GMT; HttpOnly

我正在将这个字符串从Cookie模块加载到SimpleCookie实例中。不幸的是,由于上面提到的bug,当我稍后从morsel字典中拉出expires时,它返回Sun,。我发现可以通过在Set-Cookie头的Expires组件周围添加引号(或者在值中包含空格的任何键/值对周围添加引号)来克服此错误。你知道吗

因此:

workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires=Sun, 02-Dec-2012 5:57:25 GMT; HttpOnly

将变成:

workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires="Sun, 02-Dec-2012 5:57:25 GMT"; HttpOnly

还有这个:

test=a b c; Path=/; Expires=a b c; HttpOnly

将变成:

test="a b c"; Path=/; Expires="a b c"; HttpOnly

我知道我可以将字符串分解为标记,并在它们之间循环寻找空格,然后重新构建字符串,但我很好奇,性能最好的解决方案是什么。正如我提到的,这是一个反向代理,可能每秒处理几百个请求,所以我希望这个替换尽可能快。你知道吗

正则表达式替换(当然是预编译的)是否有效?我听说正则表达式很重。。。。你知道吗


Tags: path字符串id代理cookiesessionbugdec
2条回答

这个正则表达式怎么样:

import re
header = re.sub("(?<==)[^;]* [^;]*", r'"\g<0>"', header)

这将在=之后的任何内容周围插入引号,直到下一个;(或字符串结尾),但前提是中间至少有一个空格。你知道吗

>>> header = 'test=a b c; Path=/; Expires=a b c; HttpOnly'
>>> re.sub("(?<==)[^;]* [^;]*", r'"\g<0>"', header)
'test="a b c"; Path=/; Expires="a b c"; HttpOnly'
>>> header = "workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires=Sun, 02-Dec-2012 5:57:25 GMT; HttpOnly"
>>> re.sub("(?<==)[^;]* [^;]*", r'"\g<0>"', header)
'workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires="Sun, 02-Dec-2012 5:57:25 GMT"; HttpOnly'

你需要在过期日期前后加引号吗,或者在页眉的任意位置加引号吗?如果是前者,试试这个:

header = "workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires=Sun, 02-Dec-2012 5:57:25 GMT; HttpOnly"
print(header.replace('Expires=', 'Expires="').replace('GMT', 'GMT"'))

相关问题 更多 >

    热门问题