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