从脚本中解析行

时间:2013-09-11 17:12:27

标签: python parsing

我需要从代表服务器任务的文件中读取行。这些线由几对组成,其中一些是重复的。我需要解析它们,消除重复项并将它们分成2组以便更好地执行。这就是aline的样子:

'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984

我想获得:

task1 task2
task3 task4

我是Python的新手(仅限C体验),并希望在我的代码中使用更多pythonic函数。这是我目前的代码(仍然不完整但已经有错误):

def findgroups(s):
    group=[]
    n=[]
    for i in range(len(s)):
        group.append(s[i])        
        if s[i]==',':
            n.append(group)
            group=[]
    return n

def finduniques(groups):
    unique=[]
    for i in range(len(groups)):
        if groups.count(groups[i])==1:
            unique.append(groups[i])
    return unique

def makegroups(groups):
    group1=[]
    group2=[]
    for i in range(len(groups)):
        if i%2==0:
            group1.append(groups[i])
        if i%2==1:
            group2.append(groups[i])

def printgroups(group1, group2):
    for i in range(len(group1)):
        for j in range(len(group2)):
            if i==j:
                print group1[0],group2[0]


line = "'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984"
groups = find_groups(line)
uniques = find_uniques(groups)
pairs = makegroups(uniques)
print printgroups(pairs)

3 个答案:

答案 0 :(得分:2)

您可以使用:

import re
from itertools import izip_longest

line = "'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984"
tasks = set(re.findall("'(.*?)'->\d+", line))
for t1, t2 in izip_longest(*[iter(tasks)] * 2, fillvalue=''):
    print t1, t2
# task1 task2
# task3 task4
  • 查找单引号内的所有内容,其后跟->和一些数字
  • 放入一套消除重复的内容
  • 分成两个,如果有一个奇数,请留空字符串''

答案 1 :(得分:1)

这可以实现你想要的:

>>> import ast

>>> s = "'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984"
>>> d = ast.literal_eval('{' + s.replace('->', ':') + '}')
{'task1': 3124, 'task2': 7743, 'task3': 3456, 'task4': 23984}

>>> it = iter(d) 
>>> for first, second in zip(it, it):
        print first, second
task1 task2
task3 task4

答案 2 :(得分:1)

欢迎使用python,您只需执行以下操作即可

list(set([l.split('->')[0][1:-1] for l in line.split(', ')]))

这将为您的输入示例

返回以下内容
['task1', 'task2', 'task3', 'task4']

说明:

  • 分割

      
        

    这将按给定的字符拆分字符串。这里','和'',所以这将返回所有对

      
  • l.split( ' - >')[0]

      
        

    这将使用引号

    拆分对并选择任务名称   
  • l.split( ' - >')[0] [1:-1]

      
        

    这将从1到len-1个字符中选择任务名称的一部分,这是删除引号。

      
  •   
        

    这会将列表转换为一组唯一元素。

      
  • 列表

      
        

    将集合转换回列表