这是文本文件sb.txt
JOHN:ENGINEER:35?:
现在这段代码试图在上面的行中执行正则表达式搜索。
biodata1 = re.search(r'([\w\W])+?:([\w\W])+?:([\w\W])+?:',line)
现在我得到了 biodata1.group(1)、biodata1.group(2) 和 biodata1.group(3) 的正确输出。
但是,如果我通过从末尾删除“:”来修改文件
JOHN:ENGINEER:35?
然后再次运行脚本,我得到以下错误,这是有道理的,因为 group(3) 没有成功匹配
Traceback (most recent call last):
File "dictionary.py", line 26, in <module>
print('re.search(r([\w\W])+?:([\w\W])+?:([\w\W])+? '+biodata1.group(1)+' '+biodata1.group(2)+' '+biodata1.group(3)) # STMT1
AttributeError: 'NoneType' object has no attribute 'group'
但是 group(1) 和 group(2) 应该仍然分别匹配“N”“R”。无论如何要避免这个错误并尝试正则表达式的最佳尝试方法,这样它就不会失败并且至少打印 biodata1.group(1) & biodata1.group(2)。
我试图通过不让它打印 biodata1.group(3) 来编辑输出语句,尽管那没有用
请您参考如下方法:
我认为您误解了发生的事情。您的整个正则表达式都无法匹配,因此没有匹配对象。
它说 AttributeError: 'NoneType' object has no attribute 'group' 它试图告诉你 biodata1 是 None。当匹配失败时,您从 re.search 获得的返回是 None。
需要明确的是,没有办法获得“最佳匹配”。你要求的是 re 应该决定你真正想要什么。如果您希望组是可选的,则需要将它们设为可选。
根据您的实际需要,您可以尝试使用正则表达式:
r'([\w\W])+?:([\w\W])+?:([\w\W])+?:?'
或
r'([\w\W])+?:([\w\W])+?:(([\w\W])+?:)?'
这分别使最后一个 : 和整个最后一组可选。
