鱼C论坛

 找回密码
 立即注册
查看: 1396|回复: 16

[已解决]关于正则表达式

[复制链接]
发表于 2020-7-5 16:35:27 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)

"([abc])+" [abc]是在abc选一个的意思吧
([abc])+  至少一个单元素组?
m.groups()返回不应该是很多个元素的一个元祖吗
最佳答案
2020-7-5 20:47:04
tiger吴 发表于 2020-7-5 18:22
1[abc]是用它的子子字符串去匹配?
2优先用它的最大子字符串去匹配,也就是它自己?
3它的子字符串包括 ...

这里我解释了一些,你可以看看↓
https://fishc.com.cn/thread-173265-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-5 16:44:24 | 显示全部楼层
m = re.match("([abc])+", "abc")


括号默认是捕获组,而你在括号后面 + 是表示将括号里面的内容进行一次或多次匹配({3},*,+都是如此),而不等价于 ([abc])([abc])([abc])

而你想匹配到 ('a','b','c') 就这样写吧:
import re
m = re.match("([abc])([abc])([abc])", "abc")
print(m.groups())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-5 16:44:59 From FishC Mobile | 显示全部楼层
只要找到 abc 中的一个,就表示匹配成功,
所以只有一个 group
但我不知道为什么会返回 c
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-5 16:57:47 From FishC Mobile | 显示全部楼层
_2_ 发表于 2020-7-5 16:44
只要找到 abc 中的一个,就表示匹配成功,
所以只有一个 group
但我不知道为什么会返回 c

这是小甲鱼的教程里面的,我也看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-5 17:00:42 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-7-5 16:44
括号默认是捕获组,而你在括号后面 + 是表示将括号里面的内容进行一次或多次匹配({3},*,+都是如此) ...

,而你在括号后面 + 是表示将括号里面的内容进行一次或多次匹配({3},*,+都是如此),而不等价于 ([abc])([abc])([abc])
重点:为何不等价?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-5 17:05:33 | 显示全部楼层
tiger吴 发表于 2020-7-5 17:00
,而你在括号后面 + 是表示将括号里面的内容进行一次或多次匹配({3},*,+都是如此),而不等价于 ([abc ...

是表示将括号里面的内容进行一次或多次匹配,而不是每次都匹配组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-5 17:14:45 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-7-5 17:05
是表示将括号里面的内容进行一次或多次匹配,而不是每次都匹配组

就是abc里面选择一个重复多次然后去匹配?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-5 17:22:20 | 显示全部楼层
本帖最后由 Twilight6 于 2020-7-5 17:29 编辑
tiger吴 发表于 2020-7-5 17:14
就是abc里面选择一个重复多次然后去匹配?


不对,是能匹配 a、b、c  因为匹配默认是贪婪匹配的,也就是匹配到最后一个符合条件的,所以结果为 ('c',),而如果是非贪婪结果就为:('a',)

非贪婪代码:
import re
m = re.match("([abc])+?", "abc")
print(m.groups())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-5 18:22:14 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-7-5 17:22
不对,是能匹配 a、b、c  因为匹配默认是贪婪匹配的,也就是匹配到最后一个符合条件的,所以结果为 ('c ...

1[abc]是用它的子子字符串去匹配?
2优先用它的最大子字符串去匹配,也就是它自己?
3它的子字符串包括'abc','ab','ac','bc','a','b','c'?
4子字符串的顺序能变不,比如'cba'?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-5 20:47:04 | 显示全部楼层    本楼为最佳答案   
tiger吴 发表于 2020-7-5 18:22
1[abc]是用它的子子字符串去匹配?
2优先用它的最大子字符串去匹配,也就是它自己?
3它的子字符串包括 ...

这里我解释了一些,你可以看看↓
https://fishc.com.cn/thread-173265-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-5 21:00:58 From FishC Mobile | 显示全部楼层
liuzhengyuan 发表于 2020-7-5 20:47
这里我解释了一些,你可以看看↓
https://fishc.com.cn/thread-173265-1-1.html

我再把正则表达式看一遍了在研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-5 21:06:50 From FishC Mobile | 显示全部楼层
liuzhengyuan 发表于 2020-7-5 21:03
ok,如果问题解决了,别忘记设【最佳答案】

等我研究明白了,再来看你们所有人的答案再评了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 01:13:37 | 显示全部楼层
tiger吴 发表于 2020-7-5 18:22
1[abc]是用它的子子字符串去匹配?
2优先用它的最大子字符串去匹配,也就是它自己?
3它的子字符串包括 ...




[abc]是用它的子子字符串去匹配?


[ ]: 中括号,匹配所包含的任意一个字符,所以你这里包含了 abc 就是可以匹配 a、b或c

优先用它的最大子字符串去匹配,也就是它自己?


有点没懂这句话的意思,你应该说的是贪婪吧,是的,默认是贪婪模式只要符合条件就一直匹配下去,直到条件不符合

它的子字符串包括'abc','ab','ac','bc','a','b','c'?


看懂了第一个问题,这个问题就迎刃而解了~

子字符串的顺序能变不,比如'cba'?


可以边,在[ ]符合里你理解为匹配中括号里有的字符就好了 [abc] 和 [bca] 和[cab] 都是等价的


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

使用道具 举报

 楼主| 发表于 2020-7-6 12:51:30 From FishC Mobile | 显示全部楼层
_2_ 发表于 2020-7-5 16:44
只要找到 abc 中的一个,就表示匹配成功,
所以只有一个 group
但我不知道为什么会返回 c

研究这么久,我觉得是,一对()算一个组,代码中刚好只有一对小括号,所以它的子组只有一个,由于正则表达式的贪婪机制,所以这个子组是'c'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-6 12:53:22 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-7-5 17:22
不对,是能匹配 a、b、c  因为匹配默认是贪婪匹配的,也就是匹配到最后一个符合条件的,所以结果为 ('c ...

研究这么久,我觉得是,一对()算一个组,代码中刚好只有一对小括号,所以它的子组只有一个,由于正则表达式的贪婪机制,所以这个子组是'c'
这样子说我比较能理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 12:55:48 | 显示全部楼层
tiger吴 发表于 2020-7-6 12:53
研究这么久,我觉得是,一对()算一个组,代码中刚好只有一对小括号,所以它的子组只有一个,由于正则表达 ...


对的,没毛病
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-6 12:59:40 From FishC Mobile | 显示全部楼层
liuzhengyuan 发表于 2020-7-5 20:47
这里我解释了一些,你可以看看↓
https://fishc.com.cn/thread-173265-1-1.html

研究一番,还是你这个讲的比较好,最佳送上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 03:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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