【发布时间】:2021-10-15 20:12:02
【问题描述】:
我对 python 还很陌生,所以请与我交流。我正在尝试提取两个标记之间特定子字符串的所有实例并将其导出到新列。该文件包含数千列,有时我感兴趣的列 (['INFO']) 有数百行。具体来说,我想提取始终跟随“|HIGH|”的字符串如下例所示。
**#CHROM POS ALT INFO
217 1 21351411 <DEL> SVTYPE=DEL;STRANDS=+-:25;SVLEN=-18597;END=21370008;CIPOS=-10,652;CIEND=-236,9;CIPOS95=-1,104;CIEND95=-48,2;IMPRECISE;SU=25;PE=25;SR=0;ANN=<DEL>|transcript_ablation|HIGH|Khdc1c|Khdc1c|transcript|NM_001033904.1|protein_coding|1/3|c.-17246_*281del|p.0?|||||,<DEL>|splice_region_variant&downstream_gene_variant|LOW|Khdc1a|Khdc1a|transcript|NM_183322.2|protein_coding|3/3|c.*319_*18915del|||||0|,<DEL>|3_prime_UTR_variant|MODIFIER|Khdc1a|Khdc1a|transcript|NM_183322.2|protein_coding|3/3|c.*319_*18915del|||||319|,<DEL>|upstream_gene_variant|MODIFIER|Khdc1c|Khdc1c|transcript|NM_001033904.1|protein_coding|1/3|c.-17246_*281del|||||16919|,<DEL>|downstream_gene_variant|MODIFIER|Khdc1c|Khdc1c|transcript|NM_001033904.1|protein_coding|1/3|c.-17246_*281del|||||0|,<DEL>|intergenic_region|MODIFIER|Khdc1a-Khdc1c|Khdc1a-Khdc1c|intergenic_region|Khdc1a-Khdc1c|||n.21351412_21370008del||||||,<DEL>|intergenic_region|MODIFIER|Khdc1c-Khdc1b|Khdc1c-Khdc1b|intergenic_region|Khdc1c-Khdc1b|||n.21351412_21370008del||||||,**
我对 ['INFO'] 列感兴趣的每一行都包含“...|HIGH|Gene_here|”。 给定行中可能有数百个这样的行,我希望给定行的所有子字符串实例都导出到一个新列但保留在同一行中。我只想要“|HIGH|”后面的基因名称但在下一个“|”之前结束在所有情况下都被提取到新列中。
我曾尝试使用正则表达式通过 for 循环执行此操作,但无法完全弄清楚。
import re
for substring in df['INFO']:
df = df['INFO']
pattern = "HIGH\|(\w+)\|"
substring = re.search(pattern, df).group(1)
df['GENE'] = susbtring
【问题讨论】:
-
也许您应该使用适当的工具解析您的字符串。看看 BioPython。