假设:
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])
这听起来不错吗?还有其他想法/建议吗?
答案 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))
请注意,这将返回一个可匹配的匹配对象,而不是匹配的子串的列表。