如果列表索引不在范围之外,则使用数字在Python中为列表编制索引

时间:2016-05-16 21:09:42

标签: python for-loop indexing list-comprehension

我正在使用Python构建解析器,在解析器的一个步骤中,它需要查看接下来的几行以确定是否存在值。为此,我正在做以下事情:

if "Account Summary" in line:
    end_bal_regex = r"Ending balance on (.*?)\s+(-?\$[\d,]+\.\d\d)"
    end_date, end_bal = [re.search(end_bal_regex, text[i+j], re.IGNORECASE).groups() for j in range(1,16) if re.search(r"Ending balance", text[i+j], re.IGNORECASE)][0]

99%的情况下此工作正常,但有时在“帐户摘要”行之后没有15行文本。有没有办法,在列表理解中说出类似text[i+j] or text[i:](显然是伪代码)的东西?我的假设是我必须将其转换为正常的for循环,并执行以下操作:

if "Account Summary" in line:
    end_date, end_bal = None, None
    for j in range(1,16):
      if j > len(text[i:]):
          break
      if re.search(r"Ending balance", text[i+j], re.IGNORECASE):
          end_date, end_bal = re.search(end_bal_regex, text[i+j], re.IGNORECASE).groups()

我真的不想重写我的各种代码行(就像这一行一样),这种格式,但我不知道有什么能实现我的需要。任何见解或建议都表示赞赏。

对于可重现的示例,您可以使用以下内容:

lines = ["Account Summary", "Beginning Balance", "Random Text 1", "Random Text 2", "Random Text 3", "Random Text 4", "Ending Balance"]

1 个答案:

答案 0 :(得分:1)

将限制16更改为min(16, len(text[i:]))

... for j in range(1, min(16, len(text[i:]))) re.search(r"Ending balance", text[i+j], re.IGNORECASE)][0]