【问题标题】:difficulty in selecting elements in a python list在 python 列表中选择元素的困难
【发布时间】:2014-02-03 19:47:07
【问题描述】:

我一直在尝试清理一个 txt 文件,而且我几乎完成了。我的列表有问题 - 我无法选择我在 process_line() 中创建的列表中与 ### 对应的元素。

下面是sn-p的代码;

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我得到了一些东西[2|1-A]

【问题讨论】:

  • 为什么不在line='|'.join(line.split()) 之后做line = re.sub('D0+\d|F0+\d|-', '', line)
  • 你能提供一个例子line吗?
  • 能否提供线路输入示例?
  • 对正则表达式始终使用原始字符串 (r"...")。
  • 我不明白seq = str(line.split()) 行的str 部分。 line.split()line 分解成我认为你想要的部分——没有必要用它制作一个字符串,然后删除你引入的括号和引号。

标签: python regex python-2.7


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您。我将处理您提供的 sn-p。如果它有助于澄清事情,seq[1] & seq[6] 是关于一个组中有多少片段的指标。输出是标识符|group1|group2。如果第一个 3 日期线的情况下它有 1 个片段,最后 2 个应该有 2 个组...对不起,我在呈现错误输出时出错了...它应该是 12e8H|1-107|108-212.. . 一些数据在一组中有 2 到 3 个片段......但我真的很感谢你的帮助!它有点创建了一个新的逻辑路径!
  • 嗨老师!我想使用 if 语句来查询如果 seq[1] = 1,我如何编码?
猜你喜欢
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
相关资源
最近更新 更多