在Python中匹配字符串中的基因

时间:2018-02-08 23:36:22

标签: python regex subset

我试图将一个文件中的文本字符串(基因名称)与另一个文件的列中的文本字符串进行匹配,以便在第二个文件中创建子集。

为简单起见,第一个看起来或多或少是这样的:

hits = ["IL1", "NRC31", "AR", etc.]

然而,第二个df中感兴趣的列看起来像这样:

68 NFKBIL1;NFKBIL1;ATP6V1G2;NFKBIL1;NFKBIL1;NFKBI 236 BARHL2 272 ARPC2;ARPC2 324 MARCH5 ... 11302 NFKBIL1;NFKBIL1;ATP6V1G2;NFKBIL1;NFKBIL1;NFKBI 426033 ABC1;IL1;XYZ2 ... 425700 IL17D 426295 RAB3IL1 426474 IL15RA;IL15RA

我想出了:

df2[df2.UCSC_RefGene_Name.str.contains('|'.join(hits), na=False)]

但是我需要匹配基因IL1,如果它落在弦的中间(例如上面的426033)但不是相似的基因(例如上面的第426295行)。

如何使用正则表达式来说: " 匹配hits中的任何字符串,当他们有';'或者'空白'在基因名称的开头或结尾处,但是当它们在任一侧有其他字母或数字时(表示具有相似名称的不同基因)

我还需要在数据帧2中排除任何带NA的行。

是的,我知道有正则表达式的语法文档,但是这里有太多可移动的部分让我理解它们。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望在正则表达式中使用动态字段。

这可行,正如您在this示例中所看到的那样:

gene = "IL1"
pattern = r'(?<!^)(?<=\s|;){0}(?![\w])'.format(gene)


或者,您可以捕获文件中的整个基因列表:(test

(?<!^)(?<=\s|;)[A-Z0-9]+

答案 1 :(得分:0)

对于这种微观级别的角色处理,如果你很幸运能够编写一个有效的查询,那么查询最终会变得很笨拙,反应时间很长。

这更像是一种脚本操作。