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

col17t5w  于 2023-06-07  发布在  Python
关注(0)|答案(2)|浏览(122)

假设:

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

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

nzk0hqpo

nzk0hqpo1#

你目前的做法似乎完全合理。另一种选择是只连接整个字符串,并忽略 Package 后开始的任何匹配。
例如:

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

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

nkhmeac6

nkhmeac62#

def cyclic_substring(string,substring):
  new_string=2*string
  m=len(substring)
  n=len(string)
  if m<n:
    if substring in new_string :
      return True
  else : 
      return False
#lets take a example of principal
cyclic_substring("principal","ipalp")

相关问题