首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >很难理解RE.findall()在这里做什么

很难理解RE.findall()在这里做什么
EN

Stack Overflow用户
提问于 2015-02-02 15:01:17
回答 1查看 43关注 0票数 0

我正试着拥抱Python模块。然而,我很难理解为什么python3认为findall()有两个匹配。

代码语言:javascript
复制
>>>import re
>>>re.match('\d{1,3}[-\s]?\d{1,3}[-\s]?\d{1,4}', '123-345--0987')
<_sre.SRE_Match object; span=(0, 7), match='123-345'>
>>>re.search('\d{1,3}[-\s]?\d{1,3}[-\s]?\d{1,4}', '123-345--0987')
<_sre.SRE_Match object; span=(0, 7), match='123-345'>
>>>re.findall('\d{1,3}[-\s]?\d{1,3}[-\s]?\d{1,4}', '123-345--0987')
['123-345', '0987']

我认为findall()调用与0987不匹配?我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-02 15:07:43

代码语言:javascript
复制
>>>re.findall('\d{1,3}[-\s]?\d{1,3}[-\s]?\d{1,4}', '123-345--0987')
['123-345', '0987']

为什么?

因为\d{1,3}匹配的数字范围从1到3贪婪地。因为它是贪婪的,所以它试图匹配最大可能的东西,因此,123-345被匹配,而下面的--由于双破折号而失败。然后尝试从剩下的字符串中找到一个匹配项,因此0987得到了匹配-- "09" matched by \d{1,3}"8" matched by \d{1,3}"7" matched by \d{1,4}

代码语言:javascript
复制
123-345--0987   \d{1,3}

起初,\d{1,3}试图贪婪地匹配这三个数字。如果没有找到三位数,则尝试匹配2位数,然后是一位数。由于贪婪中的上述模式,它匹配123345098

代码语言:javascript
复制
123-345--0987   \d{1,3}[-\s]?

然后尝试匹配以下可选的-或空格。所以123-345-098被匹配了。

代码语言:javascript
复制
123-345--0987   \d{1,3}[-\s]?\d{1,3}

它匹配123-3450987,在第二个匹配和额外的7,因为您定义了\d{1,3}匹配的数字范围从1到3(回溯发生在这里)。

代码语言:javascript
复制
123-345--0987   \d{1,3}[-\s]?\d{1,3}[-\s]?

[-\s]?匹配一个可选的空格字符或破折号。现在,这匹配了123-345-0987,保持了原样。因为这个模式是可选的。

代码语言:javascript
复制
123-345--0987   \d{1,3}[-\s]?\d{1,3}[-\s]?\d{1,4}

为了提供匹配,所有贪婪匹配的123-345都后退一步,而123-345中的5由最后一个\d{1,4}模式匹配。注意,它会将-放到以前匹配的123-345-中,因为5-后面没有数字。现在开始第二场比赛( 0987 ).我们已经得到了一个匹配,但是为了提供一个匹配,\d{1,4}匹配最后一个7,以及[-\s]?\d{1,4}匹配8之前存在的\d{1,3}模式。回溯发生在这里。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28280562

复制
相关文章

相似问题

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