【问题标题】:Python regex findall list index out of rangePython regex findall 列表索引超出范围
【发布时间】:2021-12-02 20:15:27
【问题描述】:
import re
with open("day2.txt", "r") as file: 
    line=file.read().split("\n")
    forward=0
    pos=0
    for i in range(0,len(line)-1):
        a=line[i]
        print(a)
        if (re.findall('^f',a)[0]) == 'f':
             forward=forward+int(((re.findall('\d',a)[0])))
        if (re.findall('^u',a)[0]) == 'u':
             pos=pos-int(((re.findall('\d',a)[0])))
        if (re.findall('^d',a)[0]) == 'd':
             pos=pos+int(((re.findall('\d',a)[0])))
print(forward*pos)
            

这里 a or line[i] 是一个字符串。 input.txt 文件中的测试用例是这样的,不过几千行

forward 6
up 4
forward 8
down 6
forward 9

理想情况下,输出应该是6+8 的总和 当我将它作为脚本运行时出现错误,我得到 list index out of range,但当我通过 shell 逐行运行时没有错误

确切的错误信息是:

Traceback (most recent call last):
  File "day2.py", line 10, in <module>
    if (re.findall('^u',a)[0]) == 'u':
IndexError: list index out of range

我哪里错了?

【问题讨论】:

  • input.txt 长什么样子?
  • 这是一个包含几千行文本的文本文件,其模式类似于测试用例下的代码框。即forward 6\n up 4\n forward 8\n,对提到相同的问题进行了编辑。谢谢
  • 好的,您能否在您的问题中添加几行,并确保它们包含导致您的问题的行。
  • 现在更新了,我的错
  • 问题是你的re.findall('^f',a)什么也没找到,所以索引0超出了范围。你真的需要在这里使用regex吗?您的文件是否只有forwardup 后跟数字?

标签: python regex data-manipulation


【解决方案1】:

可以使用regex,但在我看来,这将是非常过度设计的。由于您的文件由少量已知字符串后跟数字组成,因此您可以简单地根据字符串隔离数字。

这应该可行:

forward = 0
pos = 0
with open("input.txt", 'r') as file:
    elements = file.read().split("\n")

for e in elements:
    if "forward" in e:
        forward += int(e[7:])
    elif "up" in e:
        pos -= int(e[2:])
    elif "down" in e:
        pos += int(e[4:])

print(forward*pos)

【讨论】:

  • 将字符串拼接索引替换为-1,您将始终访问字符串的最后一个值。这消除了知道字符串长度以在正确索引处开始切片的需要。正则表达式的优势在于能够定义未知字符的模式并提取与该模式匹配的任何内容。如果您知道您正在寻找字符串 'forward',那么使用 in 关键字更具可读性并降低代码复杂性。您也可以使用 in 访问列表中的所有元素,通过索引访问列表中的元素可能会导致错误并降低可读性。
  • 我接受了这个解决方案,它奏效了。谢谢。但是有没有一种方法可以让我使用过度设计的正则表达式方法。
  • @CrunchyLentils 我不建议[-1],因为如果值大于 9,那会中断,但当然,如果值在 [0, 9] 范围内,那会更容易。跨度>
猜你喜欢
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多