需要从python列表中提取表格格式的数据

时间:2018-11-20 10:17:38

标签: regex python-3.x

                           Team A              Team B

   name                     xyz                 abc
  addres                   345,JH colony       43,JK colony
  Phone                    76576               87866

  name                     pqr                 ijk
  addres                   345,ab colony       43,JKkk colony
  Phone                    7666666               873336

在上面,我有2个球队,每个球员的姓名,地址和电话号码列在列表中。但是,没有这样的表,但是我尝试读取的数据格式为表格格式,其中在A团队中,B团队是第二列和第三列,而第一列是标签名称,地址电话所在的位置。 我的目标是仅获取按球队名称分组的球员的姓名。在此示例中,每个团队有2名球员。它可以介于1到2之间。有人可以使用正则表达式来帮助共享解决方案吗?我尝试了一下,但这给了我随机的结果,例如A队中的B队球员。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这应该对您有用,将来我会在您输入的字符串上提供更多详细信息,因为我假设有空格。如果它使用制表符,请尝试用四个空格替换它们。我添加了额外的一行,其中包括一个更困难的案例。

警告:如果B队比A队拥有更多的球员,则可能会将多余的球员归入A队。但这​​将取决于确切的格式。

import re

pdf_string = '''                         Team A              Team B

   name                     xyz                 abc
   addres                   345,JH colony       43,JK colony
   Phone                    76576               87866

   name                     pqr                 ijk
   addres                   345,ab colony       43,JKkk colony
   Phone                    7666666               873336

   name                     forename surname    
   addres                   345,ab colony       
   Phone                    7666666             '''

lines_untrimmed = pdf_string.split('\n')

lines = [line.strip() for line in lines_untrimmed]

space_string = ' ' * 3 #  3 spaces to allow spaces between names and teams

# This can be performed as a one liner below, but I wrote it out for an explanation
lines_csv = []
for line in lines:
    line_comma_spaced = re.sub(space_string + '+', ',', line)
    line_item_list = line_comma_spaced.split(',')
    lines_csv.append(line_item_list)
# lines_csv = [re.sub(space_string + '+', ',', line).split(',') for line in lines]


teams = lines_csv[0]

team_dict = {team:[] for team in teams}

for line in lines_csv:
    if 'name' in line:
        line_abbv = line[1:]  # [1:] to remove name
        for i, team in enumerate(teams):
            if i < len(line_abbv):  # this will prevent an error if there are fewer names than teams
                team_dict[team].append(line_abbv[i])
print(team_dict)

这将给出输出:

{'Team A': ['xyz', 'pqr', 'forename surname'], 'Team B': ['abc', 'ijk', 'ijk']}