在字符串中查找并使用多次出现的字符串
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_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]
它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)]
最近开始使用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_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]
它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)]