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]+\)+)$”或类似的内容