我正在尝试解析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'
有人可以解释一下它的含义以及需要做出哪些修改吗?
答案 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'