0

例如,我知道,如果我想找到所有连续出现的“a”的长度

在输入 =“1111aaaaa11111aaaaaaa111aaa”,我可以

[len(s) for s in re.findall(r'a+', input)]


但是,我不确定如何使用 char 变量执行此操作。例如,

CHAR = 'a'
[len(s) for s in re.findall(r'??????', input)]    # Trying to find occurrences of CHARs..

有没有办法做到这一点??

4

2 回答 2

2

这是一个适用于任何长度的字符串的通用解决方案:

CHAR = 'a'
[len(s) for s in re.findall(r'(?:{})+'.format(re.escape(CHAR)), input)]

或使用itertools(仅单个字符)的替代方法:

import itertools
[sum(1 for _ in g) for k, g in itertools.groupby(input) if k == CHAR]
于 2013-11-12T23:41:48.927 回答
1

我想你要的是:

[len(s) for s in re.findall(r'{}+'.format(CHAR), input)]

当然,如果CHAR是一个特殊值,这将不起作用,例如\. 如果这是一个问题:

[len(s) for s in re.findall(r'{}+'.format(re.escape(CHAR)), input)]

如果要匹配两个或多个而不是一个或多个,则其语法为{2,}. 正如文档所说:

{m,n}使生成的 RE 匹配前一个 RE 的 m 到 n 个重复,尝试匹配尽可能多的重复。例如,a{3,5}将匹配 3 到 5 个'a'字符。省略m指定下限为零,省略n指定无限上限。例如,a{4,}b将匹配aaaab或一千个'a'字符后跟一个b,但不是aaab……</p>

当我们使用{}字符串格式化时,这有点难看,所以让我们切换到%-formatting:

[len(s) for s in re.findall(r'%s{2,}' % (re.escape(CHAR),), input)]

…或者只是简单的串联:

[len(s) for s in re.findall(re.escape(CHAR) + r'{2,}', input)]
于 2013-11-12T23:41:46.807 回答