1
TimePPT 2018-01-30 14:40:57 +08:00 1
因为 + 默认是贪婪( greedy )的。
故你的 f2 = re.compile('(B|C|D)+') 中正则的实际语义是「字符串中匹配('B' | 'C'| 'D')的字符直到下一个字符不满足该表达式为止」 所以,如果 text = 'ABCDEFABCGHBCIJCD' 你会发现 f2.findall(text) 的结果是['D', 'C', 'C', 'D'] |
2
chenstack 2018-01-30 19:00:04 +08:00 2
如果模式有 group,findall 返回的列表中的元素是所有 group 的内容组成的元组,(B|C|D)+的只有一个 group,其匹配内容是字串 BCD 的最后一个部分 D (结合#1 的讲解),比如把模式改为((B|C|D)+),f2.findall(text)的结果则为[('BCD', 'D')]
|
3
Ctry 2018-01-31 13:09:44 +08:00
|
4
chenstack 2018-01-31 14:10:52 +08:00
@Ctry Help on function findall in module re:
findall(pattern, string, flags=0) Return a list of all non-overlapping matches in the string. If one or more capturing groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result. 结合我在#2 说的,如果想存粹地获取匹配的内容,可以 import re text = 'ABCDE' f2 = re.compile('(B|C|D)+') print([m.group(0) for m in re.finditer(f2, text)]) |