AttributeError:' NoneType'对象没有属性' groups' - re.search

时间:2017-10-25 19:04:46

标签: python csv

我正在尝试解析CSV文件中行的前3个元素。以下是CSV文件中的数据:

{::[name]str1_str2_str3[0]},1,U0.00 - Sensor1 Not Ready\nTry Again,1,0,12

我想从第一个元素解析[]中的值0或1。然后是第二个元素中的值。从第三个元素开始,我想解析子字符串" Sensor1 Not Ready",然后将其转换为UPPERCASE并用下划线替换空格(例如 - SENSOR1_NOT_READY)。然后在新列中打印字符串。

正如我之前的question之一所建议的那样,

我做了以下事情 -

import csv
import re

with open('filename.csv', 'rb') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        tag_name = row[0] # Column A
        bit_num = row[1] # Column B
        error_name = row[2] # Column C

        term0 = '\[(\d)\].*'
        term1 = '(\d+)'
        term2 = '.*-\s([\w\s]+)\\n'

        capture0 = list(re.search(term0, tag_name).groups())
        capture1 = list(re.search(term1, bit_num).groups())
        capture2 = list(re.search(term2, error_name).groups())

当我尝试打印capture2时,出现以下错误 -

AttributeError: 'NoneType' object has no attribute 'groups'

有人可以解释一下它的含义以及需要做出哪些修改吗?

3 个答案:

答案 0 :(得分:1)

如果re.search找不到正则表达式的匹配项,则会返回None。在尝试致电re.search()之前,您应检查.groups()的返回值是否返回结果:

result = re.search(term2, error_name)
capture2 = list(result.groups()) if result else None

答案 1 :(得分:0)

re模块找不到匹配项并且您想要求.groups()功能时,会发生错误。
您可以使用try/except机制:

try:
    capture2 = list(re.search(term2, error_name).groups())
except NoneType:
    capture2 = None

...或简单的if/else块:

m = re.search(term2, error_name)
if m:
    capture2 = list(m.groups())
else:
    capture2 = None

这里的根本问题是你的表达式找不到任何东西。

答案 2 :(得分:0)

第三个表达式不匹配,因为文件中的数据是

{::[name]str1_str2_str3[0]},1,U0.00 - Sensor1 Not Ready\nTry Again,1,0,12

\n )。但是,由于换行符需要引用其他\n模块投诉且您的数据没有引号,否则可能不会这样做。

在正则表达式csv中,未转义,仍然表示换行符。你应该像这样匹配:

\\n

感谢原始前缀,现在regex会查找文字term2 = r'.*-\s([\w\s]+)\\n'