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

时间:2015-03-26 10:28:25

标签: python string find

我最近开始使用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获取所有指定的输出字符串? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

如果我理解您的问题的意图,您可以使用以下代码:

>>> 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'它只返回索引0.如果您想要考虑这种重叠的子字符串,请更改您将子字符串的索引设置为a_is = [m.start() for m in re.finditer("(?={})".format(re.escape(a)), s)]

的行

答案 1 :(得分:0)

首先,您需要在文本中获取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]

它返回[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)]]