首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使re.search()尝试最佳尝试方法

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

Stack Overflow用户
提问于 2015-06-30 12:15:17
回答 3查看 133关注 0票数 1

这是文本文件sb.txt

代码语言:javascript
复制
JOHN:ENGINEER:35?:

现在,这是一段试图在上面的行上执行regex搜索的代码。

代码语言:javascript
复制
 biodata1 = re.search(r'([\w\W])+?:([\w\W])+?:([\w\W])+?:',line)

现在,我得到了生物数据1组(1)、生物数据1组(2)和生物数据1组(3)的适当输出。

但是,如果通过从末尾删除":“来修改文件

代码语言:javascript
复制
JOHN:ENGINEER:35?

再次运行脚本,我得到以下错误,这是有意义的,因为组(3)没有成功匹配

代码语言:javascript
复制
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),尽管这不起作用

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-30 12:18:03

我想你误解了发生了什么。您的整个正则表达式未能匹配,因此没有匹配对象。

在上面写着AttributeError: 'NoneType' object has no attribute 'group'的地方,它试图告诉你biodata1不是。没有一个是当re.search无法匹配时从它获得的返回。

要明确的是,没有办法得到“最好的匹配”。你所要求的是,re应该决定你真正想要的是什么。如果您希望组是可选的,则需要使它们成为可选的。

根据实际需要,您可以尝试regexes:

代码语言:javascript
复制
r'([\w\W])+?:([\w\W])+?:([\w\W])+?:?'

代码语言:javascript
复制
r'([\w\W])+?:([\w\W])+?:(([\w\W])+?:)?'

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

票数 3
EN

Stack Overflow用户

发布于 2015-06-30 12:25:15

您必须修改regex,以指示它究竟什么是可选的,哪些不是可选的。Python正则表达式没有这种部分匹配的概念。一种可能是将它更改为

代码语言:javascript
复制
biodata1 = re.search(r'([\w\W])+?:(?:([\w\W])+?:(?:([\w\W])+?:)?)?',line)

允许1组、2组或3组进行匹配。在这种情况下,任何不匹配的组在执行match.group(X)时都会返回空字符串

票数 2
EN

Stack Overflow用户

发布于 2015-06-30 12:25:14

regex所做的就是它与您所提供的完全匹配。没有最好的尝试或诸如此类的东西。

如果希望匹配的某些部分是可选的,则需要使用?运算符声明它。因此,在您的情况下,正则表达式需要如下所示:

代码语言:javascript
复制
biodata1 = re.search(r'([\w\W])+?:([\w\W])+?:([\w\W])+?:?',line)

另外,+? (至少一次,或者一点也不)等于* (至少0次),所以您可以这样做:

代码语言:javascript
复制
biodata1 = re.search(r'([\w\W])*:([\w\W])*:([\w\W])*:?',line)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31138042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档