在字符串中查找并使用多次出现的字符串

Find and use multiple occurences of a string in a string

最近开始使用Python,写了一些简单的脚本 现在我有这个问题:

我有这个字符串:

mystring = 'AAAABBAAABBAAAACCAAAACCAAAA'

我有以下字符串:

String_A = BB
String_B = CC

我想获得以 String_A 开头并以 String_B 结尾的所有可能的字符串组合(有点含糊,下面是所需的输出)

output: 
BBAAABBAAAACCAAACC
BBAAABBAAAACC
BBAAACCAAAACC
BBAAACC

我可以使用

计算 mystring 中 String_A 和 String_B 出现的次数
mystring.count()

并且我能够通过执行以下操作打印出一个特定的输出(第一次出现 String_A 和第一次出现 String_B 的输出):

if String_A in mystring:
    String_B_End = mystring.index(String_B) + len(String_B)
    output = mystring[mystring.index(String_A); String_B_End]
    print(output)

这很完美,但只给我以下输出:

BBAAABBAAAACC

如何从 mystring 中获取所有指定的输出字符串? 提前谢谢!

嗯,首先你需要得到文中String_AString_B的索引。看到这个:

s = mystring
[i for i in range(len(s)-len(String_A)+1) if s[i:i+len(String_A)]==String_A]

它returns[4, 9],即'BB'mystring中的索引。您对 String_B 做类似的事情,答案是 [15, 21].

然后你这样做:

[(i, j) for i in [4, 9] for j in [15, 21] if i < j]

此行将每个起始位置与每个结束位置组合在一起,并确保起始位置出现在结束位置之前。 i < j 对于这个特定示例不是必需的,但通常您应该拥有它。结果是 [(4, 15), (4, 21), (9, 15), (9, 21)].

然后你只需将开始和结束索引转换为子字符串:

[s[a:b+len(String_B)] for a, b in [(4, 15), (4, 21), (9, 15), (9, 21)]]

如果我正确理解你问题的意图,你可以使用下面的代码:

>>> import re
>>> mystring = 'AAAABBAAABBAAAACCAAAACCAAAA'
>>> String_A = 'BB'
>>> String_B = 'CC'
>>> def find_occurrences(s, a, b):
        a_is = [m.start() for m in re.finditer(re.escape(a), s)] # All indexes of a in s
        b_is = [m.start() for m in re.finditer(re.escape(b), s)] # All indexes of b in s
        result = [s[i:j+len(b)] for i in a_is for j in b_is if j>i]
        return result
>>> find_occurrences(mystring, String_A, String_B)
['BBAAABBAAAACC', 'BBAAABBAAAACCAAAACC', 'BBAAAACC', 'BBAAAACCAAAACC']

这使用从 this answer

中查找所有出现的子字符串代码

在当前形式下,代码不适用于重叠的子字符串,如果 mystring = 'BBB' 并且您查找子字符串 'BB' 它仅 returns 索引 0。如果您想考虑对于此类重叠子字符串,将获取子字符串索引的行更改为 a_is = [m.start() for m in re.finditer("(?={})".format(re.escape(a)), s)]