难以在python列表中选择元素

时间:2014-02-03 19:47:07

标签: python regex python-2.7

我一直在尝试清理txt文件,我差不多完成了它。我的列表存在问题 - 我无法在process_line()的{​​{1}}行中选择我创建的列表元素。

以下是代码片段;

###

以下是删除一些不需要的数据后的一组示例数据

def process_line(line):
    # receiving a line or string as function
    # argument and replacing '-' 'D00-D09' & 'F00-F09' to '' if it exists
    line = re.sub('D0+\d|F0+\d|-', '', line)
    seq = str(line.split())
    line = re.sub('\'|\\[|\\]|,', '', seq)
    ###  line = (seq[0] + '|' seq[3] + '-' seq[5]) # this is for shorter lines
    print line
    return line  + '\n'

我希望能够实现这样的格式,但是我需要学习如何提取所需的元素 - 所以我可以将数据重新排列为所需的格式:

12asA   1  A    4  A  330 
12asB   1  B    4  B  330 
12caA   1  A    5  A  260 
12e8H   1  H    1  H  113   1  H  114  H  212   H  213  H  214  (2)
12e8L   1  L    1  L  107   1  L  108  L  211   L  212  L  214  (3)   

而不是得到例如。 12asA|4-330 12asB|4-330 12caA|5-260 12e8H|1-113,114-212 12e8l|1-107, 108-211 我得到了23reA|1-14,56-65

1 个答案:

答案 0 :(得分:0)

我不确定你在这里尝试做什么,但这似乎符合你想要的输出:

import re

data = '''
12asA   1  A    4  A  330  
12asB   1  B    4  B  330 
12caA   1  A    5  A  260 
12e8H   1  H    1  H  113   1  H  114  H  212   H  213  H  214  (2)
12e8L   1  L    1  L  107   1  L  108  L  211   L  212  L  214  (3)
'''
lines = filter(None, data.split('\n')) # filter to remove blank lines

def process_line(line):
    line = re.sub(r'D0\d|F0\d|-', '', line)
    for char in "'[],":
        line = line.replace(char, '')
    seq = line.split()
    if len(seq) == 6:
        return '{}|{}-{}'.format(seq[0], seq[3], seq[5])
    elif len(seq) == 16:
        return '{}|{}-{},{}-{}'.format(seq[0], seq[3], seq[5], seq[8], seq[10])

result = [process_line(line) for line in lines]
for r in result:
    print(r)

输出:

12asA|4-330
12asB|4-330
12caA|5-260
12e8H|1-113,114-212
12e8L|1-107,108-211

代码中的以下正则表达式:

line = re.sub('\'|\\[|\\]|,', '', seq)

真的很乱。我用一系列简单的str.replace调用替换了它。将来,在编写正则表达式时,请使用原始字符串(例如r'...')以提高可读性并帮助您避免错误。

如果你只是添加了那行来删除通过调用str(line.split())引入的括号,逗号和引号(而不是处理原始数据中的垃圾),你应该继续删除它的等价物我发布的代码,因为它没有任何用处。