Python 3.x 多行文本上的Python解析器
我的目标是为包含多行数据的文件创建一个文本解析器:Python 3.x 多行文本上的Python解析器,python-3.x,parsing,text,Python 3.x,Parsing,Text,我的目标是为包含多行数据的文件创建一个文本解析器: Applying option loglevel (set logging level) with argument debug. Successfully parsed a group of options. Parsing a group of options: input url http://prod7.team.cn/test/tracks-v1a1/mono. Successfully parsed a group of optio
Applying option loglevel (set logging level) with argument debug.
Successfully parsed a group of options.
Parsing a group of options: input url http://prod7.team.cn/test/tracks-v1a1/mono.
Successfully parsed a group of options.
Opening an input file: http://prod7.team.cn/test/tracks-v1a1/mono
[NULL @ 000001e002039000] Opening 'http://prod7.team.cn/test/tracks-v1a1/mono' for reading
[http @ 000001e00203a040] Setting default whitelist 'http,https,tls,rtp,tcp,udp,crypto,httpproxy'
[tcp @ 000001e00203ba80] Original list of addresses:
[tcp @ 000001e00203ba80] Address 92.223.97.22 port 80
[tcp @ 000001e00203ba80] Interleaved list of addresses:
[tcp @ 000001e00203ba80] Address 92.223.97.22 port 80
[tcp @ 000001e00203ba80] Starting connection attempt to 92.223.97.22 port 80
[tcp @ 000001e00203ba80] Successfully connected to 92.223.97.22 port 80
[http @ 000001e00203a040] request: GET /test/tracks-v1a1/mono HTTP/1.1
User-Agent: Lavf/58.31.101
Accept: */*
Range: bytes=0-
Connection: close
Host: prod7.team.cn
Icy-MetaData: 1
每个文件包含多组此类信息。
我的目标是找到每个“成功连接”的IP地址,然后是主机详细信息,直到LF
在上述情况下,应使用有效匹配项
IP 92.223.97.22主机prod7.team.cn
我可以使用正则表达式很容易地找到IP,但我不知道如何创建有效的匹配,跳过更多的行,直到“host”
更新
如果我用这个正则表达式
(connected to).([0-9].(?:\.[0-9]+){3}.port.*.*)
我发现:
Match 1
Full match connected to 92.223.97.22 port 80
Group 1. connected to
Group 2. 92.223.97.22 port 80
如果在末尾添加.*或.host.*则收到错误消息。我不知道如何添加另一个pattergn来检测“Host:”并获得匹配,直到行末。 您希望在多行模式下运行正则表达式,这将允许您匹配换行符。然后,您可以使用类似于
*
的方法来捕获中间的内容
需要注意的是,您应该确保检查以确保不会遇到新的匹配起点。如
CA.*B
将同时匹配CAB和CACB以及CACAB。因此,您很可能希望显式地签入正则表达式,以避免超出与*
有效匹配的开头,我可以使用嵌套正则表达式进行排序:
ip_list = []
regex = r'connected(.*?)Host[^\n]+$'
text_as_string = open('C:\\temp\\log.txt', 'r').read()
matches = re.finditer(regex, text_as_string, re.DOTALL | re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
block = str(match.group())
#print connected IP
ip = re.compile('(connected to).[0-9]+(?:\.[0-9]+){3}.port.*')
for match in re.finditer(ip, block):
f_id=match.group()
#print connected host
host = re.compile('Host[^\n]+$')
for match in re.finditer(host, block):
f_host=match.group()
if f_id =='':
f_id='NA'
if f_host =='':
f_host='NA'
ip_list.append([f_id,f_host])
unique_ip = reduce(lambda l, x: l if x in l else l+[x], ip_list, [])
如果在末尾添加.*或.host.*则收到错误消息。我不知道如何添加另一个pattergn来检测“Host:”并获得匹配,直到行的末尾。您不希望以。*结尾,因为这将匹配文件的整个其余部分。对于deceting host,只需添加它,例如“*(\'host\':\w*([a-z]+\)+)$”或类似的内容