python - 拆分一个字符恰好重复两次的序列
问题描述
我想拆分一个字符恰好重复两次的序列,并保留分隔部分。有没有更短的正则表达式?
In [101]: seq='tgtttccgagtgacccgagatagaaacttaccgga'
In [102]: l=[ s for s in re.split(r"(?<!a)(a{2})(?!a)|(?<!g)(g{2})(?!g)|(?<!c)(c{2})(?!c)|(?<!t)(t{2})(?!t)",seq) if s ]
In [103]: l
Out[103]: ['tgttt', 'cc', 'gagtgacccgagatagaaac', 'tt', 'a', 'cc', 'gg', 'a']
In [104]: ''.join(l)==seq
Out[104]: True
解决方案
而不是正则表达式,使用itertools.groupby
:
import itertools
def get_combos(d):
for a, b in d:
if a:
yield from b
else:
yield ''.join(b)
seq='tgtttccgagtgacccgagatagaaacttaccgga'
new_seq = [''.join(b) for _, b in itertools.groupby(seq)]
final_result = list(get_combos([[a, list(b)] for a, b in itertools.groupby(new_seq, key=lambda x:len(x) == 2 and x[0] == x[1])]))
输出:
['tgttt', 'cc', 'gagtgacccgagatagaaac', 'tt', 'a', 'cc', 'gg', 'a']
推荐阅读
- javascript - Angular:是否需要再使用 app.server.module.ts?
- performance - 以管理员身份更快地环回适配器
- javascript - 如何一次分配100个号码
- javascript - 如何在 Reactjs 中获取表格
- python-3.x - GBQ DML 无法按条件删除行
- javascript - 按多个键分组的逻辑
- java - 为什么我在 android 中使用 Recycler View 时出现运行时异常
- ios - 使用 SPM 包时无法将 iOS 应用程序提交到 iTunes 连接
- elasticsearch - 搜索 Elasticsearch 时自定义分析器不起作用
- c - 打印 3、5 和两者的倍数的 C 程序,专业风格建议