代码段:
for line in f:
x = re.search(r'<([^,]+),\s?([^>]+)>', line)
x,y = int(x.group(1)), float(x.group(2))
file.txt 示例
<185, 5.00>
<231, 5.00>
<292, 5.00>
这里的问题是,当在IDLE上运行时,剩下的代码就可以了 但是在终端上执行时,它会返回以下错误
'NoneType' object has no attribute 'group'
我知道这意味着什么,但为什么它首先在python IDLE中起作用?
答案 0 :(得分:2)
如果re.search
无法找到匹配项,则会返回None
。你需要检查那种可能性。您的代码不会检查,然后尝试访问group
对象没有的属性None
。
可以安全地假设re.search
正常运行。因此,剩下的结论是:
line
中包含的文字不是您所期望的,或下一步是做一些调试。查看line
中的值。如果它们不是您所期望的,则上述选项1可能是原因。如果这些值与您预期的一样,那么看起来选项2就是解释。
答案 1 :(得分:2)
我能想到的唯一原因是你的文件f
在两个环境中不一定相同,所以在IDLE re.search
匹配每一行,而在终端中迭代某些东西,但那不是那个文件,因此至少有一行与regexp不匹配。 x
然后是None
并尝试点对其进行访问group
会引发异常。
通常,您不能假设re.search
会匹配每一行。我会这样做:
result = re.search('....', line)
if result:
result.group()
...
另一个问题:你在每一行都重新编译regexp。那是非常低效的。最好在循环之前使用regex = re.compile(....)
,然后在循环中使用regex
的方法(与re.search
,re.findall
等相同)。