这是文本文件sb.txt
JOHN:ENGINEER:35?:现在,这是一段试图在上面的行上执行regex搜索的代码。
biodata1 = re.search(r'([\w\W])+?:([\w\W])+?:([\w\W])+?:',line)现在,我得到了生物数据1组(1)、生物数据1组(2)和生物数据1组(3)的适当输出。
但是,如果通过从末尾删除":“来修改文件
JOHN:ENGINEER:35?再次运行脚本,我得到以下错误,这是有意义的,因为组(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'但组(1)和组(2)仍应分别与"N“"R”匹配。是否存在避免此错误的最佳尝试方法来regex,这样它就不会失败,并至少打印出biodata1.group(1) & biodata1.group(2)。
我试图编辑输出状态,方法是不让它打印生物数据1组(3),尽管这不起作用
发布于 2015-06-30 12:18:03
我想你误解了发生了什么。您的整个正则表达式未能匹配,因此没有匹配对象。
在上面写着AttributeError: 'NoneType' object has no attribute 'group'的地方,它试图告诉你biodata1不是。没有一个是当re.search无法匹配时从它获得的返回。
要明确的是,没有办法得到“最好的匹配”。你所要求的是,re应该决定你真正想要的是什么。如果您希望组是可选的,则需要使它们成为可选的。
根据实际需要,您可以尝试regexes:
r'([\w\W])+?:([\w\W])+?:([\w\W])+?:?'或
r'([\w\W])+?:([\w\W])+?:(([\w\W])+?:)?'这分别使最后一个:和整个最后一个组成为可选的。
发布于 2015-06-30 12:25:15
您必须修改regex,以指示它究竟什么是可选的,哪些不是可选的。Python正则表达式没有这种部分匹配的概念。一种可能是将它更改为
biodata1 = re.search(r'([\w\W])+?:(?:([\w\W])+?:(?:([\w\W])+?:)?)?',line)允许1组、2组或3组进行匹配。在这种情况下,任何不匹配的组在执行match.group(X)时都会返回空字符串
发布于 2015-06-30 12:25:14
regex所做的就是它与您所提供的完全匹配。没有最好的尝试或诸如此类的东西。
如果希望匹配的某些部分是可选的,则需要使用?运算符声明它。因此,在您的情况下,正则表达式需要如下所示:
biodata1 = re.search(r'([\w\W])+?:([\w\W])+?:([\w\W])+?:?',line)另外,+? (至少一次,或者一点也不)等于* (至少0次),所以您可以这样做:
biodata1 = re.search(r'([\w\W])*:([\w\W])*:([\w\W])*:?',line)https://stackoverflow.com/questions/31138042
复制相似问题