在For循环中解析下线

时间:2016-12-09 20:49:18

标签: python csv

我正在收集输入的IP列表及其相应的票号并将其转换为csv。每个IP的票据都位于列表中IP下面的行上,那么我如何读取IP,解析其下面的票号,并​​以CSV格式打印这些值?

我的代码和IP / Tix#列表如下。

m = re.search(r'(\d{1,3}.){3}\d{1,3}(-\d{2}|slash\d{2})?',item, re.M|re.I)
n = re.search(r'10A-\d{6}',item, re.M|re.I)
for line in fiEsccb:
    if m in line:
        #go to below line and extract n (possibly multiple)
        print m + ',' + n

列表

8.8.8.8
Open Menu  10A-002671 10/21/2016

8.8.8.8
10A-003079  

8.8.8.8
10A-003179 10A-003178 10A-003172 10A-003171 10A-003170   

8.8.8.8   
10A-002970  

8.8.8.8
10A-002970  

4 个答案:

答案 0 :(得分:0)

假设您的数据是常规字符串列表,如示例所示,您可以使用itertools将其分组为三元组列表:

import itertools
data = ['8.8.8.8', 'Open Menu  10A-002671 10/21/2016', '', '8.8.8.8', '10A-003079', '', '8.8.8.8', '10A-003179 10A-003178 10A-003172 10A-003171 10A-003170', ''] # Add more lines

args=[iter(data)]*3
collected = list(itertools.zip_longest(*args, fillvalue=''))
print(collected)
# [('8.8.8.8', 'Open Menu  10A-002671 10/21/2016', ''), ('8.8.8.8', '10A-003079', ''), ('8.8.8.8', '10A-003179 10A-003178 10A-003172 10A-003171 10A-003170', '')]

此列表可以轻松保存为CSV格式。

答案 1 :(得分:0)

您可以尝试使用while True循环和readline()

while True:
    line1 = fiEsccb.readline()
    if m in line1:
         line2 = fiEsccb.readline()
         if n in line2:
             print m + ',' + line2

答案 2 :(得分:0)

您可以使用以下正则表达式从输入ip texfile中的数据生成列表,然后将其写入csv:

import csv,re

ippattern = r'\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}'
packetpattern = r'10A-\d{6}'
data = []

with open(r"C:\ipinfo.txt", 'rb') as ipfile:
    lines = ipfile.readlines()
    for line in lines:
        if re.search(ippattern,line):
            ip = re.findall(ippattern,line)[0]
            packet = re.findall(packetpattern,lines[lines.index(line)+1])[0]
            data.append([ip,packet])
with open(r"C:\ipinfo_output.csv", 'wb') as ipout:
    writer = csv.writer(ipout)
    writer.writerows(data)

输出csv:

8.8.8.8,10A-002671
8.8.8.8,10A-002671
8.8.8.8,10A-002671
8.8.8.8,10A-002970
8.8.8.8,10A-002671

这种方法产生了几个重复,我认为这是不必要的。为了避免这种情况,您可以使用字典,其中ip是字典键,数据包是字典值。然后将此字典写入csv文件。

或者您可以将此重复的csv文件导入excel,并通过remove duplicates选项卡中的microsoft excel中的一个命令Data删除重复项。

答案 3 :(得分:0)

如果我正确理解您的问题,您必须为整行应用IP的正则表达式,并为以下行中的项目的票号应用正则表达式:

import re
reIP = r'(\d{1,3}.){3}\d{1,3}(-\d{2}|slash\d{2})?'
reTicketNr = r'10A-\d{6}'
for line in fiEsccb:
  line = line.strip()
  if line == '': continue
  mg = re.match(reIP,line)
  if mg:
    ip = mg.group(0)
  else:
    possibleTicketNrs = line.split()
    for item in possibleTicketNrs:
      if re.match(reTicketNr,item):
        print(','.join([ip,item]))

使用

fiEsccb = ['8.8.8.8', 'Open Menu  10A-002671 10/21/2016', '', '8.8.8.8', '10A-003079', '', '8.8.8.8', '10A-003179 10A-003178 10A-003172 10A-003171 10A-003170', '']

你会得到:

8.8.8.8,10A-002671
8.8.8.8,10A-003079
8.8.8.8,10A-003179
8.8.8.8,10A-003178
8.8.8.8,10A-003172
8.8.8.8,10A-003171
8.8.8.8,10A-003170