将引号插入字符串的最佳pythonic方式

时间:2012-12-02 02:39:10

标签: python regex

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

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

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

所以这个:

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

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

正则表达式替换(当然是预编译)是否有效?我听说正则表达式很重......

2 个答案:

答案 0 :(得分:1)

您是否需要在Expires之后的日期或标题中任何位置出现的任意日期附近放置引号?如果是前者,试试这个:

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

答案 1 :(得分:1)

这个正则表达式怎么样:

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'