在python中:如何在“循环”字符串上执行正则表达式搜索

时间:2013-11-13 00:48:22

标签: python regex

假设:

string="aacctcaaaca"
find="aaa"

我希望找到所有出现的find。

通常,我会这样做

re.findall(find, string)

捕获的是字符串是循环的,即字符串的开头/结尾是无关紧要的。所以由前两个+最后一个组成的“aaa”也应计算在内。

另外,我想找到比赛的开始位置(上例中为6和10)

我正在考虑将字符串[0:len(find)-1]添加到字符串并对该新字符串执行re 即。

re.findall(find, string+string[0:len(find)-1])

这听起来不错吗?还有其他想法/建议吗?

1 个答案:

答案 0 :(得分:4)

您目前的做法似乎非常合理。另一种选择是只连接整个字符串并忽略在包装后开始的任何匹配。

例如:

string="aacctcaaaca"
find="aaa"
[m.group(0) for m in re.finditer(find, string+string) if m.start() < len(string)]

这有点可扩展,因为您可以使用a{3,}这样的任意正则表达式,您可能无法依赖len(find)

正如mgilson在评论中所建议的那样,你可以通过使用itertools来提高效率,这样你就不会不必要地找到重复匹配。

它看起来像这样:

from itertools import takewhile
takewhile(lambda m: m.start() < len(string), re.finditer(find, string+string))

请注意,这将返回一个可匹配的匹配对象,而不是匹配的子串的列表。