用于解析 set-cookie headers 的正则表达式
Regex for parsing set-cookie headers
我尝试在 Python 中用正则表达式解析 set-cookie headers。
对于 set-cookie header,我阅读了描述如何构建 set-cookie header 的 RFC 6265 Section 4.1。
我尝试根据规范构建正则表达式,这是我当前的状态:
([\x21\x23-\x27\x2A\x2B\x2D-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]+)=[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]*(;[\x20](((Expires|expires)=(Mon|Tue|Wed|Thu|Fri|Sat|Sun),[\x20][0-9]{2}-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-[0-9]{4}[\x20][0-9]{2}:[0-9]{2}:[0-9]{2}[\x20]GMT)|((Max-Age|max-age)=[1-9]+)|((Path|path)=[\x20-\x3A\x3C-\x7E]+)|(Secure|secure)|(HttpOnly|httponly)|([\x20-\x3A\x3C-\x7E]*)))*
我对 set-cookie header (domain=...
) 中子域的递归定义有问题,它在 RFC 1034 Section 3.5 中描述并且需要帮助来构建它正则表达式。
但我之前的代码也完全没有达到预期效果。例如这个 set-cookie header
VISITOR_INFO1_LIVE=M_6WYFFF_fo; path=/; domain=.youtube.com; secure; expires=Tue, 07-Jul-2020 00:17:35 GMT; httponly; samesite=None, GPS=1; path=/; domain=.youtube.com; expires=Thu, 09-Jan-2020 00:47:35 GMT, YSC=8sXes3YfFFF; path=/; domain=.youtube.com; httponly, VISITOR_INFO1_LIVE=M_6WYFFF_fo; path=/; domain=.youtube.com; secure; expires=Tue, 07-Jul-2020 00:17:35 GMT; httponly; samesite=None
包括 4 个 cookie(VISITOR_INFO1_LIVE
两次,GPS
和 YSC
)但我的正则表达式只捕获 3 个 cookie(YSC
cookie 丢失)。我在 https://regex101.com/
上测试
稍后我将解析许多 set-cookie header 以获取 cookie 的名称(或在 RFC 调用中 cookie-name)。
感谢帮助!
简短回答,如您询问如何使用正则表达式解析 cookie:
([^;]+);?
然后循环匹配。
您提出问题的方式表明您还想验证 cookie 并可能将它们分开。
在这个问题上花了更多时间后,我认为仅使用正则表达式几乎不可能实现你想要的。
每个 cookie 都没有唯一的标识符或分隔符。分隔符用于列内以及 cookie 之间。也没有固定的列数或强制性的最后一列。这个表达式的负数部分很难写(what not to match)。
我尝试在 Python 中用正则表达式解析 set-cookie headers。 对于 set-cookie header,我阅读了描述如何构建 set-cookie header 的 RFC 6265 Section 4.1。 我尝试根据规范构建正则表达式,这是我当前的状态:
([\x21\x23-\x27\x2A\x2B\x2D-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]+)=[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]*(;[\x20](((Expires|expires)=(Mon|Tue|Wed|Thu|Fri|Sat|Sun),[\x20][0-9]{2}-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-[0-9]{4}[\x20][0-9]{2}:[0-9]{2}:[0-9]{2}[\x20]GMT)|((Max-Age|max-age)=[1-9]+)|((Path|path)=[\x20-\x3A\x3C-\x7E]+)|(Secure|secure)|(HttpOnly|httponly)|([\x20-\x3A\x3C-\x7E]*)))*
我对 set-cookie header (domain=...
) 中子域的递归定义有问题,它在 RFC 1034 Section 3.5 中描述并且需要帮助来构建它正则表达式。
但我之前的代码也完全没有达到预期效果。例如这个 set-cookie header
VISITOR_INFO1_LIVE=M_6WYFFF_fo; path=/; domain=.youtube.com; secure; expires=Tue, 07-Jul-2020 00:17:35 GMT; httponly; samesite=None, GPS=1; path=/; domain=.youtube.com; expires=Thu, 09-Jan-2020 00:47:35 GMT, YSC=8sXes3YfFFF; path=/; domain=.youtube.com; httponly, VISITOR_INFO1_LIVE=M_6WYFFF_fo; path=/; domain=.youtube.com; secure; expires=Tue, 07-Jul-2020 00:17:35 GMT; httponly; samesite=None
包括 4 个 cookie(VISITOR_INFO1_LIVE
两次,GPS
和 YSC
)但我的正则表达式只捕获 3 个 cookie(YSC
cookie 丢失)。我在 https://regex101.com/
稍后我将解析许多 set-cookie header 以获取 cookie 的名称(或在 RFC 调用中 cookie-name)。
感谢帮助!
简短回答,如您询问如何使用正则表达式解析 cookie:
([^;]+);?
然后循环匹配。
您提出问题的方式表明您还想验证 cookie 并可能将它们分开。
在这个问题上花了更多时间后,我认为仅使用正则表达式几乎不可能实现你想要的。
每个 cookie 都没有唯一的标识符或分隔符。分隔符用于列内以及 cookie 之间。也没有固定的列数或强制性的最后一列。这个表达式的负数部分很难写(what not to match)。