打印可变长度字符串的一部分

Print a part of a string of variable length

我想打印字符串中的IP1地址request;这些是所述字符串的内容:

b'GET /submit_IP?IP1=192.168.15.66&IP2=255.255.255.0&IP3=192.168.15.1&IP4=192.168.15.1 HTTP/1.1\r\nHost: 192.168.15.66\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nReferer: http://192.168.15.66/submit_IP?IP1=192.168.15.66&IP2=255.255.255.0&IP3=192.168.15.1&IP4=192.168.15.1\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en,cs;q=0.9,en-GB;q=0.8,fr;q=0.7\r\n\r\n'

但是,问题是地址可以更长或更短,例如1.1.1.1192.168.150.150。我试过了:

print(request[(request.find(IP1=) + 4):-(len(request) - (len(request) - request.find(IP2=) - 2))])

... returns SyntaxError: 语法无效.

使用正则表达式:

例如:

import re

s = b'GET /submit_IP?IP1=192.168.15.66&IP2=255.255.255.0&IP3=192.168.15.1&IP4=192.168.15.1 HTTP/1.1\r\nHost: 192.168.15.66\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nReferer: http://192.168.15.66/submit_IP?IP1=192.168.15.66&IP2=255.255.255.0&IP3=192.168.15.1&IP4=192.168.15.1\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en,cs;q=0.9,en-GB;q=0.8,fr;q=0.7\r\n\r\n'
m = re.search(r"IP1=(.+?)(?=&)", str(s))
if m:
    print(m.group(1))    #--> 192.168.15.66

尝试

request = b'GET /submit_IP?IP1=192.168.15.66&IP2=255.255.255.0&IP3=192.168.15.1&IP4=192.168.15.1 HTTP/1.1\r\nHost: 192.168.15.66\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nReferer: http://192.168.15.66/submit_IP?IP1=192.168.15.66&IP2=255.255.255.0&IP3=192.168.15.1&IP4=192.168.15.1\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en,cs;q=0.9,en-GB;q=0.8,fr;q=0.7\r\n\r\n'

startint = str(request).find('IP1=') + 4
endint = str(request).find('&IP2=')

print(str(request)[startint:endint])

输出:

192.168.15.66

编辑:单行

print(str(request)[str(request).find('IP1=') + 4:str(request).find('&IP2=')])

您可以在 request 字符串中搜索字符 =& 以找到它们的位置。

print(request[request.find("=")+1:request.find("&")])

我会使用更通用的方法,使用 python 库 urllib 解码整个查询字符串,然后获取您想要的参数,如下所示:

import urllib.parse
query_string = request.split(b" ", 2)[1].split(b"?", 1)[1]
parameters = urllib.parse.parse_qs(query_string)

print(parameters[b"IP1"])