Python 2.7中HTTP GET请求头的正则匹配问题
解决HTTP请求头行的正则匹配问题
我来帮你搞定这个正则表达式的问题!首先咱们拆解你的需求,再一步步修正你的正则:
核心需求回顾
你要匹配的是符合以下规则的HTTP请求头行:
- 开头是一个或多个非冒号、非空格的字符(请求头的键)
- 紧接着是冒号+空格(注意:冒号前面不能有空格)
- 然后是一个或多个非冒号的字符(请求头的值,允许空格,只要没有冒号就行)
- 最后必须以换行符结尾(
\r\n或\n都兼容)
你的原始正则问题分析
你写的^.{1,}: .{1,}[/r/n]$有几个明显的问题:
.会匹配任意字符,包括冒号和空格,这就导致键和值部分会包含你想排除的冒号,完全不符合需求;[/r/n]是错误的写法——这是一个字符集,匹配的是/、r、n这三个字符中的一个,而不是换行符,正确的换行符应该用转义序列\r和\n;- 没有精准限制键和值的字符范围,导致不符合规则的行也会被匹配。
正确的正则表达式
根据你的需求,我们用否定字符集来排除特定字符,写出精准的正则:
^[^:\s]+: [^:]+\r?\n$
咱们逐个部分解释:
^:匹配行的起始位置[^:\s]+:匹配一个或多个非冒号、非空白符的字符(也就是请求头的键,确保没有冒号和空格)::严格匹配冒号紧跟一个空格(避免像Host : ...这种不符合格式的情况)[^:]+:匹配一个或多个非冒号的字符(请求头的值,允许空格,只要不含冒号就符合要求)\r?\n:兼容Windows的\r\n和Unix的\n换行符$:匹配行的结束位置
Python中使用示例
如果你用Python的re模块,这样写就可以:
import re # 匹配单行带换行的头行 header_pattern = re.compile(r"^[^:\s]+: [^:]+\r?\n$") # 如果你要从多行文本中匹配所有符合的头行,加上多行模式 header_pattern_multiline = re.compile(r"^[^:\s]+: [^:]+\r?\n?$", re.MULTILINE) # 这里的\r?\n?$是为了兼容最后一行可能没有换行的情况,如果严格要求必须有换行,可以去掉最后的?
验证你的示例
- 符合要求的行:
Host: www.stackoverflow.com\n:完全匹配正则,成功命中a-b-sads&^*@hgsdafAS&FTD: sjal;dfh9S^& D^F& (SDfsdgafs\n:键不含冒号和空格,值不含冒号,成功命中
- 不符合要求的行:
Host : www.stackoverflow.com:冒号前面多了空格,:部分不匹配,失败H:o:s:t: www.stackoverflow.com:键里有冒号,[^:\s]+在第一个冒号处就停止匹配,后续内容不匹配,失败Host: www.:::stackoverflow.com:值里有冒号,[^:]+在第一个冒号处停止匹配,失败Host: www.stackoverflow.com:没有换行符,\r?\n$部分不匹配,失败
内容的提问来源于stack exchange,提问作者ThoseKind
相关产品推荐
相关产品推荐

