2017-04-22 85 views
0

我想解析来自文本文件的数据。数据元组是一个年龄段,其中0-3倍是'正确'对齐的。无论在源数据中追踪一个年龄多少次,我都想要None“pad”三次。年龄和时间都是空间分隔的,而且时间是格式“mm:ss.dd”或“ss.dd”。年龄和时间可以重复一次或多次。我该如何格式化这个python正则表达式?

下面是一些示例数据:

test_str = ['25', 
    '24 22.10', 
    '16 59.35 1:02.44', 
    '18 52.78 59.45 1:01.22', 
    '33 59.35 1:02.44 34 52.78 59.45 1:01.22 24 25'] 

扫描,上面应该产生的元组(或列表类型的字典,...无论)

(25, None, None, None) 
(24, None, None, 0:22.10) 
(16, None, 0:59.35, 1:02.44) 
(18, 0:52.78, 0:59.45, 1:01.22) 
(33, None, 0:59.35, 1:02.44), (34, 0:52.78, 0:59.45, 1:01.22), (24, None, None, None), (25, None, None) 

我的想法是使用正则表达式,沿线的东西:

data_search = r'[1-9][0-9]((([1-9][0-9]:)?[0-9]{2}.[0-9]{2})|){3}' 
x = re.search(data_search, test_str[0]) 

但我没有成功。

有人可以帮助我的正则表达式或建议更好的解决方案吗?

+0

您在预期结果中有一个“(25,None,None)”。这是一个复制错误,对吗? –

回答

1

我相信这是接近你想要的。对不起,缺乏正则表达式。

def format_str(test_str): 
    res = [] 
    for x in test_str: 
     parts = x.split(" ") 
     thing = [] 
     for part in parts: 
      if len(thing) != 0 and '.' not in part and ':' not in part: 
       res.append(thing[:1] + [None]*(4-len(thing)) + thing[1:]) 
       thing = [part] 
      else: 
       thing.append(part) 
     if len(thing) != 0: 
      res.append(thing[:1] + [None]*(4-len(thing)) + thing[1:]) 
    return res 

test_str = ['25', 
    '24 22.10', 
    '16 59.35 1:02.44', 
    '18 52.78 59.45 1:01.22 24 22.10'] 

results = format_str(test_str) 
print(results) 

结果是:

[['25', None, None, None], ['24', None, None, '22.10'], ['16', None, '59.35', '1:02.44'], ['18', '52.78', '59.45', '1:01.22'], ['24', None, None, '22.10']] 

我没有做任何的格式就这么52.78不显示为0的时代:52.78,但我敢打赌,你可以做到这一点。如果不是,留下评论,我也会编辑一个解决方案

+0

检查冒号不是必要的:'如果len(thing)!= 0和'。'不是部分:'就够了。谢谢! – Jamie

+0

我不确定是否允许时间为xx:xx而不是xx:xx.xx,因为允许xx.xx。很高兴我很有帮助。 –

1

我不确定这是否是最好的方法,但是这会拆分第一个元素,因为它总是静态地放在第一个位置,然后拆分其余部分并填充None

test_str = ['25', 
      '24 22.10', 
      '16 59.35 1:02.44', 
      '18 52.78 59.45 1:01.22'] 

def create_tuples(string_list): 
    all_tuples = [] 
    for space_string in string_list: 
     if not space_string: 
      continue 
     split_list = space_string.split() 
     first_list_element = split_list[0] 
     last_list_elements = split_list[1:] 
     all_tuples.append([first_list_element] + [None] * (3 - len(last_list_elements)) + last_list_elements) 
    return all_tuples 

print(create_tuples(test_str)) 

# Returns: 
[['25', None, None, None], ['24', None, None, '22.10'], ['16', None, '59.35', '1:02.44'], ['18', '52.78', '59.45', '1:01.22']] 
+0

我想我可以使用它。如果我可以按照'年龄'以某种方式分解字符串...... – Jamie

0
>>> age_expr = r"(\d+)" 
>>> time_expr = r"((?:\s+)(?:\d+:)?\d+\.\d+)?" 
>>> expr = re.compile(age_expr + time_expr * 3) 
>>> [expr.findall(s) for s in test_str] 
[[('25', '', '', '')], [('24', ' 22.10', '', '')], [('16', ' 59.35', ' 1:02.44', '')], [('18', ' 52.78', ' 59.45', ' 1:01.22')], [('33', ' 59.35', ' 1:02.44', ''), ('34', ' 52.78', ' 59.45', ' 1:01.22'), ('24', '', '', ''), ('25', '', '', '')]] 
+0

从那里,你可以迭代结果并修改。我相信这可以用来从文本中提取匹配与其他文本不匹配的匹配。 – spacebat777