我有以下数据:
POST / HTTP/1.1
User-Agent: curl/7.27.0
Host: 127.0.0.1
Accept: */*
Content-Length: 55
Content-Type: application/x-www-form-urlencoded
id=1234&var=test&nextvar=hh%20hg&anothervar=BB55SSKKKkk
或
POST / HTTP/1.1\r\n
User-Agent: curl/7.27.0\r\n
Host: 127.0.0.1\r\n
Accept: */*\r\n
Content-Length: 55\r\n
Content-Type: application/x-www-form-urlencoded\r\n
\r\n
id=1234&var=test&nextvar=hh%20hg&anothervar=BB55SSKKKkk\r\n
或
POST / HTTP/1.1^M
User-Agent: curl/7.27.0^M
Host: 127.0.0.1^M
Accept: */*^M
Content-Length: 55^M
Content-Type: application/x-www-form-urlencoded^M
^M
id=1234&var=test&nextvar=hh%20hg&anothervar=BB55SSKKKkk^M
我怎样才能匹配id=1234&var=test&nextvar=hh%20hg&anothervar=BB55SSKKKkk
字符串?我的意思是在two end of lines
(\r\n or ^M
)和下一个end of line
(\r\n or ^M
)之间可打印的任何内容
我试过像:
re.findall(r'^>([^\r\n]+)[\r\n]([a-zA-Z0-9=%&\r\n]+)', buf, re.MULTILINE|re.DOTALL)
但没有匹配。我做错了什么?
答案 0 :(得分:1)
我不确定为什么你的正则表达式开头有>
。这就是阻止你获得任何比赛的原因。如果你现在删除它,那么你可能不需要很多匹配。
我建议:
(?<![\r\n])(?:\r\n|\r|\n){2}[^\r\n]+
这可确保您在尝试匹配的行之前只有2个连续的换行符(两个\r\n
,\r
或\n
)。负面的后视(?<![\r\n])
是强制执行它的(如果在两个连续的换行符之前有换行符或回车符,则匹配失败)。
上面的正则表达式实际上并不需要multiline和dotall标志,因此如果你愿意,可以在这个实例中删除它们。
编辑:由于\r
,\n
和^M
不是元字符,我建议:
(?<![\r\n])(?:(?:\\r\\n|\^M)?(?:\r\n|\r|\n)){2}((?:(?!\\r\\?n?|\\n|\^M)[^\r\n\x00])+)(?:\\r\\n|\^M)?
答案 1 :(得分:1)