首页 > python处理文本

python处理文本

有如下的文本内容:

208 **1675137** Netizen restored undeleted Netizen
207 1648639 Netizen
206 **1648621** 142.58.181.84
205 1646546 Patrick
204 1638165 Patrick

我现在需要做的事情是找到含有 restored 的这一行,记录下这个第二列的 ID 内容,然后根据 restored 这一行的 undeleted 的对象,也就是 undeleted 后面的那个列的内容,继续往下找到该对象所在行,然后记录下这个对象所在行的下一行的 ID,然后将其跟 restored 所在行的 ID 对应输出。
照这个文本的例子来说,就是先找到 208 所在的含 restored 的这一行 ID 1675137. 然后在看这行 undeleted 的对象是 Netizen,就继续往下读,找到第三列为 Netizen 的这行,就是 207 这一行。然后记录下 207 的下一行 206 的ID 1648621。
最后输出这两个对应 ID。也就是输出这样的形式: 1675137 1648621 这样的就行了,就是加粗的两个ID。

请问各位大神有什么思路么。


补充下,还有可能出现这样的情况:

153 **1254853** Eloquence restored undeleted Eloquence
152 1254819 Eloquence
151 1254815 Eloquence
150 1254812 Eloquence
149 1254799 Eloquence
148 1254796 Eloquence
147 1254782 Eloquence
146 1254771 Eloquence
145 **1254740** 217.185.183.250

这种 undeleted 对象有很多连续行的,这个就是取的最后一个对象的下一行。。像加粗的 ID 那样
另外我希望能打印出这样的格式:

111 222
112 333
113 444

这种对应的格式。就拿上面两个例子,输出的结果应该是:

1675137 1648621
1254853 1254740

这样的输出格式


虽然有点过了,但是算是一个finite state machine。每行文本作文每个状态的输入。然后在3个状态之间这么转。但是如果一共只有这三行的话,有点过。


import re


def file_generator(file):
    with open(file) as f:
        for line in f:
            yield re.split(r'\s+', line.strip())

my_file = file_generator('sample.txt')
for items in my_file:
    if 'restored' in items:
        restored_id = items[1]
        obj = items[-1]
        while True:
            if obj not in items:
                items = next(my_file)            
                continue
            while obj in items:
                items = next(my_file)
            print('%s %s' % (restored_id, items[1]))
            break
【热门文章】
【热门文章】