3

认为:

string="aacctcaaaca"
find="aaa"

我想找到所有出现的find。

通常,我会做

re.findall(find, string)

问题是字符串是圆形的,即字符串的开始/结束是无关紧要的。所以由前两个+最后一个组成的“aaa”也应该被计算在内。

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

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

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

听起来对吗?还有其他想法/建议吗?

4

1 回答 1

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))

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

于 2013-11-13T00:51:28.030 回答