我正在使用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"]
答案 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]