假设我有以下字符串: ABCyuioppsfsABCsfrsfsfsaABCfds
如何快速找到第一个字符串“ ABC”和所有其他“ ABC”字符串之间的距离?
第一个“ ABC”字符串从字符串的第一个位置开始,第二个“ ABC”字符串从字符串的第13个位置开始,第三个字符串从字符串的第25个位置开始。我想找到如何快速计数
答案 0 :(得分:2)
列表理解如何?
A='ABCyuioppsfsABCsfrsfsfsaABCfds'
[len(i) for i in A.split('ABC')][:-1]
[0,9,9]
这会打印出每个'ABC'
之间的距离。
编辑:对您的帖子进行会计处理:
import itertools
A='ABCyuioppsfsABCsfrsfsfsaABCfds'
li=[len(i)+1 if len(i)==0 else len(i)+len('ABC') for i in A.split('ABC')][:-1]
print(list(itertools.accumulate(li)))
[1,13,25]
答案 1 :(得分:1)
您可以在列表理解中使用re.finditer
。这也将返回第一个匹配项,该匹配项当然可以忽略或分割:
>>> import re
>>> s = 'ABCyuioppsfsABCsfrsfsfsaABCfds'
>>> [sub.start() for sub in re.finditer('ABC', s)]
[0, 12, 24]
答案 2 :(得分:0)
您可以找到每个ABC
的所有索引,然后从其余的索引中减去第一个:
from re import finditer
abc = "ABCyuioppsfsABCsfrsfsfsaABCfds"
indices = [m.start() for m in finditer('ABC', abc)]
diffs = [x - indices[0] for x in indices[1:]]
print(diffs)
# [12, 24]
答案 3 :(得分:0)
如果您正在考虑“之间的距离”,则必须指定该距离是在“ ABC”的每个开始位置之间还是在它们之间的字符数(“ ABC”字符串本身除外)之间。另一方面,您的示例似乎表明您根本不在寻找距离。似乎您正在寻找基于1的索引。 (Python列表中的索引从零开始)。
s = "ABCyuioppsfsABCsfrsfsfsaABCfds"
from itertools import accumulate
distance_between_strings = accumulate( len(d)+3*(i>0) for i,d in enumerate(s.split("ABC")[1:-1]) )
print(list(distance_between_strings))
# [9, 21]
distance_between_starts = accumulate(len(d)+3 for d in s.split("ABC")[1:-1])
print(list(distance_between_starts))
# [12, 24]
import re
just_positions = [m.start()+1 for m in re.finditer("ABC",s)]
print(just_positions)
# [1, 13, 25]