我一直在尝试清理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
答案 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())
引入的括号,逗号和引号(而不是处理原始数据中的垃圾),你应该继续删除它的等价物我发布的代码,因为它没有任何用处。