鱼C论坛

 找回密码
 立即注册
查看: 1657|回复: 10

[已解决]关于python中re使用的分组疑惑

[复制链接]
发表于 2020-8-21 11:25:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
本帖最后由 紫夜之恋 于 2020-8-21 11:44 编辑

在看小甲鱼老师分享的正则表达式遇到一个分组的问题,如果按照老师的操作是没有问题的,但是如果在老师前面的例子上加个分组去测试就看不懂了。
第一个不加括号的,可以匹配到3 15 3
第二个加括号的,为什么15只匹配到了5,请哪位知道的大大解释一下
废话不多说,直接上图
最佳答案
2020-8-21 12:18:12
紫夜之恋 发表于 2020-8-21 12:01
是有这种写法的,我是在问这种写法应该如何理解

哦哦,这样啊。那给你解释一下
p=re.compile('([\d])+')
#这钟写法,匹配这个组的一次或多次,然后返回该分组,分组内容是一个数字
p=re.compile('([\d]+)')
#这种写法,匹配这个分组一次,分组内容是一个或多个数字

写+号看不太好理解,你若写成2就好理解了
p=re.compile('([\d]){2}')
print(p.findall ('3只小甲鱼,15条腿,多出的3条在哪里?'))
这个是匹配两个该分组,分组内容是一个数字。这样匹配到的就只有一个了
结果是:
['5']
因为3不符合条件,匹配条件是需要有两个数字,3那里只有一个。
匹配的时候先看到数字3,然后向后没有第二个数字了,不符合;看到1,在向后看到5,符合了,返回5;后面的3也是如此
a1.png
a2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-21 11:53:48 | 显示全部楼层
你的分组括号加的位置不对,应该把+也括进去
p=re.compile('([\d]+)')
print(p.findall ('3只小甲鱼,15条腿,多出的3条在哪里?'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-21 12:01:13 | 显示全部楼层
本帖最后由 紫夜之恋 于 2020-8-21 12:02 编辑
sunrise085 发表于 2020-8-21 11:53
你的分组括号加的位置不对,应该把+也括进去


是有这种写法的,我是在问这种写法应该如何理解

bb.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 12:18:12 | 显示全部楼层    本楼为最佳答案   
紫夜之恋 发表于 2020-8-21 12:01
是有这种写法的,我是在问这种写法应该如何理解

哦哦,这样啊。那给你解释一下
p=re.compile('([\d])+')
#这钟写法,匹配这个组的一次或多次,然后返回该分组,分组内容是一个数字
p=re.compile('([\d]+)')
#这种写法,匹配这个分组一次,分组内容是一个或多个数字

写+号看不太好理解,你若写成2就好理解了
p=re.compile('([\d]){2}')
print(p.findall ('3只小甲鱼,15条腿,多出的3条在哪里?'))
这个是匹配两个该分组,分组内容是一个数字。这样匹配到的就只有一个了
结果是:
['5']
因为3不符合条件,匹配条件是需要有两个数字,3那里只有一个。
匹配的时候先看到数字3,然后向后没有第二个数字了,不符合;看到1,在向后看到5,符合了,返回5;后面的3也是如此
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 13:14:20 | 显示全部楼层
p=re.compile('([\d])+')
#这钟写法,匹配这个组的一次或多次,然后返回该分组,分组内容是一个数字
p=re.compile('([\d]+)')
#这种写法,匹配这个分组一次,分组内容是一个或多个数字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-21 14:34:13 | 显示全部楼层
本帖最后由 紫夜之恋 于 2020-8-21 14:39 编辑
sunrise085 发表于 2020-8-21 12:18
哦哦,这样啊。那给你解释一下


对的,和我理解的一样,我是想问,为什么就返回了5 而不是15

或者再简单的问,为什么不加括号可以直接获取15, 而加了括号获取的只是5
QQ截图20200821143849.png
QQ截图20200821143911.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 16:21:53 | 显示全部楼层
紫夜之恋 发表于 2020-8-21 14:34
对的,和我理解的一样,我是想问,为什么就返回了5 而不是15

或者再简单的问,为什么不加括号可以直 ...

因为你加小括号了啊,小括号是分组,只捕获分组内的内容,而组内只有一个数字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-21 17:42:30 | 显示全部楼层
sunrise085 发表于 2020-8-21 16:21
因为你加小括号了啊,小括号是分组,只捕获分组内的内容,而组内只有一个数字

如果这么理解的话,15是2个数字挨着的,为什么捕获5, 1就没有被捕获
我感觉就是这个点我没理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 18:28:51 | 显示全部楼层
紫夜之恋 发表于 2020-8-21 17:42
如果这么理解的话,15是2个数字挨着的,为什么捕获5, 1就没有被捕获
我感觉就是这个点我没理解

四楼的时候不是和你讲过了么?
读到1的时候,还不符合条件,因为只识别到一个数字,读到5的时候才识别到两个连续数字,所以5才是符合条件的,1不符合条件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 10:11:54 | 显示全部楼层
sunrise085 发表于 2020-8-21 18:28
四楼的时候不是和你讲过了么?
读到1的时候,还不符合条件,因为只识别到一个数字,读到5的时候才识别到 ...


好吧 如果是这样的话 只能说我没理解
我以为15符合条件所以就应该返回15
原来是这么理解的
非常感谢你的解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 10:29:42 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 03:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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