tiger吴 发表于 2020-7-5 16:35:27

关于正则表达式

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

"()+" 是在abc选一个的意思吧
()+至少一个单元素组?
m.groups()返回不应该是很多个元素的一个元祖吗

Twilight6 发表于 2020-7-5 16:44:24

m = re.match("()+", "abc")

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

而你想匹配到 ('a','b','c') 就这样写吧:
import re
m = re.match("()()()", "abc")
print(m.groups())

_2_ 发表于 2020-7-5 16:44:59

只要找到 abc 中的一个,就表示匹配成功,
所以只有一个 group
但我不知道为什么会返回 c

tiger吴 发表于 2020-7-5 16:57:47

_2_ 发表于 2020-7-5 16:44
只要找到 abc 中的一个,就表示匹配成功,
所以只有一个 group
但我不知道为什么会返回 c

这是小甲鱼的教程里面的,我也看不懂

tiger吴 发表于 2020-7-5 17:00:42

Twilight6 发表于 2020-7-5 16:44
括号默认是捕获组,而你在括号后面 + 是表示将括号里面的内容进行一次或多次匹配({3},*,+都是如此) ...

,而你在括号后面 + 是表示将括号里面的内容进行一次或多次匹配({3},*,+都是如此),而不等价于 ()()()
重点:为何不等价?

Twilight6 发表于 2020-7-5 17:05:33

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

是表示将括号里面的内容进行一次或多次匹配,而不是每次都匹配组

tiger吴 发表于 2020-7-5 17:14:45

Twilight6 发表于 2020-7-5 17:05
是表示将括号里面的内容进行一次或多次匹配,而不是每次都匹配组

就是abc里面选择一个重复多次然后去匹配?

Twilight6 发表于 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")
print(m.groups())

tiger吴 发表于 2020-7-5 18:22:14

Twilight6 发表于 2020-7-5 17:22
不对,是能匹配 a、b、c因为匹配默认是贪婪匹配的,也就是匹配到最后一个符合条件的,所以结果为 ('c ...

1是用它的子子字符串去匹配?
2优先用它的最大子字符串去匹配,也就是它自己?
3它的子字符串包括'abc','ab','ac','bc','a','b','c'?
4子字符串的顺序能变不,比如'cba'?

liuzhengyuan 发表于 2020-7-5 20:47:04

tiger吴 发表于 2020-7-5 18:22
1是用它的子子字符串去匹配?
2优先用它的最大子字符串去匹配,也就是它自己?
3它的子字符串包括 ...

这里我解释了一些,你可以看看↓
https://fishc.com.cn/thread-173265-1-1.html

tiger吴 发表于 2020-7-5 21:00:58

liuzhengyuan 发表于 2020-7-5 20:47
这里我解释了一些,你可以看看↓
https://fishc.com.cn/thread-173265-1-1.html

我再把正则表达式看一遍了在研究

tiger吴 发表于 2020-7-5 21:06:50

liuzhengyuan 发表于 2020-7-5 21:03
ok,如果问题解决了,别忘记设【最佳答案】

等我研究明白了,再来看你们所有人的答案再评了

Twilight6 发表于 2020-7-6 01:13:37

tiger吴 发表于 2020-7-5 18:22
1是用它的子子字符串去匹配?
2优先用它的最大子字符串去匹配,也就是它自己?
3它的子字符串包括 ...




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

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

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

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

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

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

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

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


tiger吴 发表于 2020-7-6 12:51:30

_2_ 发表于 2020-7-5 16:44
只要找到 abc 中的一个,就表示匹配成功,
所以只有一个 group
但我不知道为什么会返回 c

研究这么久,我觉得是,一对()算一个组,代码中刚好只有一对小括号,所以它的子组只有一个,由于正则表达式的贪婪机制,所以这个子组是'c'

tiger吴 发表于 2020-7-6 12:53:22

Twilight6 发表于 2020-7-5 17:22
不对,是能匹配 a、b、c因为匹配默认是贪婪匹配的,也就是匹配到最后一个符合条件的,所以结果为 ('c ...

研究这么久,我觉得是,一对()算一个组,代码中刚好只有一对小括号,所以它的子组只有一个,由于正则表达式的贪婪机制,所以这个子组是'c'
这样子说我比较能理解

Twilight6 发表于 2020-7-6 12:55:48

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


对的,没毛病

tiger吴 发表于 2020-7-6 12:59:40

liuzhengyuan 发表于 2020-7-5 20:47
这里我解释了一些,你可以看看↓
https://fishc.com.cn/thread-173265-1-1.html

研究一番,还是你这个讲的比较好,最佳送上
页: [1]
查看完整版本: 关于正则表达式