Python 解析脚本中的行

Python 解析脚本中的行,python,parsing,Python,Parsing,我需要从表示服务器任务的文件中读取行。这些线由几对线组成,其中一些线是重复的。我需要解析它们,消除重复项,并将它们分成两组,以便更好地执行。这就是aline的样子: 'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984 我想获得: task1 task2 task3 task4 我对Python非常陌生(只有C方面的经验),希望能在代码中使用更多Python函数。这是

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

'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984
我想获得:

task1 task2
task3 task4
我对Python非常陌生(只有C方面的经验),希望能在代码中使用更多Python函数。这是我当前的代码(仍然不完整,但已经有错误):

您可以使用:

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
  • 在单引号中查找后面跟着
    ->
    和一些数字的所有内容
  • 放入一组以消除重复项
  • 分成两组,在有奇数的地方,留下一个空白字符串
    '
您可以使用:

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
  • 在单引号中查找后面跟着
    ->
    和一些数字的所有内容
  • 放入一组以消除重复项
  • 分成两组,在有奇数的地方,留下一个空白字符串
    '

这可以满足您的需求:

>>> 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

这将实现您想要的:

>>> 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

欢迎使用python,您可以简单地执行以下操作

list(set([l.split('->')[0][1:-1] for l in line.split(', ')]))
这将返回以下输入示例

['task1', 'task2', 'task3', 'task4']
说明:
  • 分裂

    这将按给定的字符拆分字符串。这里是“,”和“”,因此将返回所有对

  • l、 拆分('->')[0]

    这将拆分该对并用引号拾取任务名称

  • l、 拆分('->')[0][1:-1]

    这将从1到len-1字符中选取任务名称的部分,这是为了删除引号

  • 设置

    这将把列表转换成一组唯一的元素

  • 名单

    将集合转换回列表


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

list(set([l.split('->')[0][1:-1] for l in line.split(', ')]))
这将返回以下输入示例

['task1', 'task2', 'task3', 'task4']
说明:
  • 分裂

    这将按给定的字符拆分字符串。这里是“,”和“”,因此将返回所有对

  • l、 拆分('->')[0]

    这将拆分该对并用引号拾取任务名称

  • l、 拆分('->')[0][1:-1]

    这将从1到len-1字符中选取任务名称的部分,这是为了删除引号

  • 设置

    这将把列表转换成一组唯一的元素

  • 名单

    将集合转换回列表


第一条规则:不要试图用Python编写C。与“组中的i(组)”不同的是,“组中的i(组)[i])”的“do_something”,而“组中的i(组)”的“do_something”“Tak”的其他名称是什么?它的格式只有taskn,n是一个整数。元素的顺序在最终输出中重要吗?对不起,这是我用python字典做的测试。@John,现在可以了吗?您的代码使用dict还是不使用dict?第一条规则:不要尝试用Python编写C。与“组中的i(组)”不同的是,“组中的i(组)[i])”的“do_something”,而“组中的i(组)”的“do_something”“Tak”的其他名称是什么?它的格式只有taskn,n是一个整数。元素的顺序在最终输出中重要吗?对不起,这是我用python字典做的测试。@John,现在可以了吗?您的代码使用dict还是不使用dict?