我知道,例如,如果我想找到连续'a'的所有出现的长度
在input =“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..
有办法吗?
答案 0 :(得分: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]
答案 1 :(得分: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,}
。正如the docs所说:
{m,n}
使得到的RE匹配前一个RE的m到n次重复,尝试匹配尽可能多的重复。例如,a{3,5}
将匹配3到5个'a'
个字符。省略 m 指定零的下限,省略 n 指定无限上限。例如,a{4,}b
将匹配aaaab
或一千'a'
个字符,后跟b
,但不会aaab
...
当我们使用{}
进行字符串格式化时会有点难看,所以让我们切换到%
- 格式化:
[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)]