请选择 进入手机版|继续访问电脑版
发新帖

请教下大神关于正则表达式的用法

[复制链接]
7184 3

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
import re
text = 'ABCDE'
f1 = re.compile('(B|C|D)')
f2 = re.compile('(B|C|D)+')
print(f1.findall(text))
print(f2.findall(text))

运行结果是:
['B', 'C', 'D']
['D']

请教下大神们为什么第二个只返回一个 D,谢谢!!!

举报 使用道具

回复

精彩评论3

timeppt  新手上路  发表于 2018-1-31 14:39:57 | 显示全部楼层
因为 + 默认是贪婪( greedy )的。
故你的 f2 = re.compile('(B|C|D)+')  中正则的实际语义是「字符串中匹配('B' | 'C'| 'D')的字符直到下一个字符不满足该表达式为止」

所以,如果 text = 'ABCDEFABCGHBCIJCD'
你会发现 f2.findall(text) 的结果是['D', 'C', 'C', 'D']

举报 使用道具

回复
chenstack  新手上路  发表于 2018-1-31 15:39:45 | 显示全部楼层
如果模式有 group,findall 返回的列表中的元素是所有 group 的内容组成的元组,(B|C|D)+的只有一个 group,其匹配内容是字串 BCD 的最后一个部分 D (结合#1 的讲解),比如把模式改为((B|C|D)+),f2.findall(text)的结果则为[('BCD', 'D')]

举报 使用道具

回复
ctry  注册会员  发表于 2018-1-31 15:53:32 | 显示全部楼层
@chenstack
@TimePPT
两位 V 友,你们好。我对这边有一点疑问:为什么'(B|C|D)+'匹配到了字串 BCD,但是 findall()函数返回的是最后一部份'D'呢?为什么不是返回整个'BCD'呢?

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表