作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设:
string="aacctcaaaca"
find="aaa"
我想找出所有出现的 find。
通常情况下,我会这样做
re.findall(find, string)
要注意的是字符串是循环的,即字符串的开始/结束是无关紧要的。所以前两个+最后一个a组成的“aaa”也要算进去。
另外,我想找到匹配的开始位置(上例中的6和10)
我正在考虑将 string[0:len(find)-1] 添加到 string 并在该新字符串上执行 re即
re.findall(find, string+string[0:len(find)-1])
听起来对吗?还有其他想法/建议吗?
最佳答案
您目前的做法似乎非常合理。另一种选择是仅连接整个字符串并忽略包装后开始的任何匹配项。
例如:
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))
请注意,这将返回匹配对象的可迭代对象,而不是匹配子字符串的列表。
关于python - 在 python : How to perform regular expression search on "circular" string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19943113/
我是一名优秀的程序员,十分优秀!