Skip to main content
 首页 » 编程设计

python之如何使 re.search() 尝试最佳尝试方法

2025年05月04日15yyy_WW

这是文本文件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])+?:)?' 

这分别使最后一个 : 和整个最后一组可选。