Python REGEX将多行与回车匹配

时间:2014-01-29 09:13:21

标签: python regex

我有以下数据:

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)

但没有匹配。我做错了什么?

2 个答案:

答案 0 :(得分:1)

我不确定为什么你的正则表达式开头有>。这就是阻止你获得任何比赛的原因。如果你现在删除它,那么你可能不需要很多匹配。

我建议:

(?<![\r\n])(?:\r\n|\r|\n){2}[^\r\n]+

这可确保您在尝试匹配的行之前只有2个连续的换行符(两个\r\n\r\n)。负面的后视(?<![\r\n])是强制执行它的(如果在两个连续的换行符之前有换行符或回车符,则匹配失败)。

上面的正则表达式实际上并不需要multiline和dotall标志,因此如果你愿意,可以在这个实例中删除它们。

regex101 demo


编辑:由于\r\n^M不是元字符,我建议:

(?<![\r\n])(?:(?:\\r\\n|\^M)?(?:\r\n|\r|\n)){2}((?:(?!\\r\\?n?|\\n|\^M)[^\r\n\x00])+)(?:\\r\\n|\^M)?

regex101 demo

答案 1 :(得分:1)

试试这个:

(?:(?:\^M)|[\n\r])+(id=.*)(?=(?:\^M)|[\n\r])

<强> Check online DEMO

解释

enter image description here