仅在终端错误'NoneType'对象中没有属性'group'

时间:2014-05-16 13:25:18

标签: python regex

代码段:

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中起作用?

2 个答案:

答案 0 :(得分:2)

如果re.search无法找到匹配项,则会返回None。你需要检查那种可能性。您的代码不会检查,然后尝试访问group对象没有的属性None

可以安全地假设re.search正常运行。因此,剩下的结论是:

  1. line中包含的文字不是您所期望的,或
  2. 你的正则表达式不正确。
  3. 下一步是做一些调试。查看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.searchre.findall等相同)。