我在python3中有这样的字符串:
ab_cdef_ghilm__nop_q__rs
从特定的字符开始,基于索引位置,我想在此字符的每侧5个字符周围切一个窗口。但是,如果找到了_字符,则必须跳过并转到下一个字符。例如,考虑在该字符串中的字符“ i”,我希望在“ i”周围有一个11个字符的最终字符串,每次输出时都将跳过_个字符,例如输出以下内容:
defghilmnop
考虑到我有很长的字符串,并且我想确定在该位置执行此操作的索引位置。在这种情况下,index = 10是否有一个命令可以裁剪特定大小的字符串而跳过特定字符?
目前,我要做的是从字符串中删除_,同时计算_出现的次数,并使用它来定义中间索引位置的偏移,最后我裁剪出所需大小的窗口,但是我想让事情变得更具说服力,所以如果我每次他发现“ _”太完美了,我都可以跳一下]
例如:
s = 'ab_cdef_ghilm__nop_q__rs'
def get_slice(s, idx, n=5, ignored_chars='_'):
d = {i: ch for i, ch in enumerate(s) if ch not in ignored_chars}
if idx in d:
keys = [k for k in d.keys()]
idx = keys.index(idx)
return ''.join(d[k] for k in keys[max(0, idx-n):min(idx+n+1, len(s))])
print(get_slice(s, 10, 5, '_'))
打印:
defghilmnop
如果print(get_slice(s, 1, 5, '_'))
:
abcdefg
st = "ab_cdef_ghilm__nop_q__rs"
def slice(st, ind, c_count):
cp = [char!="_" for char in st]
for i in range(len(st)):
if sum(cp[ind:ind+i]) == c_count:
break
right = ind + i
for i in range(len(st)):
if sum(cp[ind-i:ind]) == c_count:
break
left = ind - i
return st[left:right+1]
slice(st, 10, 5)