Python:查找变量char的正则表达式

时间:2013-11-12 23:39:35

标签: python regex string character

我知道,例如,如果我想找到连续'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..

有办法吗?

2 个答案:

答案 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)]