1

我有一个这样的列表:

番茄4439, >gi|224089052|ref|XP_002308615.1| 预测蛋白质 [毛果杨]

我想使用 python 去除不需要的字符,所以列表看起来像:Tomato Populus trichocarpa

我可以为第一个执行以下操作:

name = ">Tomato4439"
name = name.strip(">1234567890")
print name
Tomato

但是,我不确定如何处理第二个。任何建议将不胜感激。

4

5 回答 5

3

给定:

s='Tomato4439, >gi|224089052|ref|XP_002308615.1| predicted protein [Populus trichocarpa]'

这:

s = s.split()
[s[0].strip('0123456789,'), s[-2].replace('[',''), s[-1].replace(']','')]

会给你

['Tomato', 'Populus', 'trichocarpa']

如果您要经常这样做,可能值得研究正则表达式,并且“规则”可能不是静态的,因为正则表达式在这种情况下处理数据更加灵活。但是,对于您提出的示例问题,这将起作用。

于 2012-09-13T18:13:15.910 回答
1
>>> import re
>>> line = "Tomato4439, >gi|224089052|ref|XP_002308615.1| predicted protein [Populus trichocarpa]"
>>> match = re.match("^([a-zA-Z]+).*\[([a-zA-Z ]+)\].*",line)
>>> match.groups()
('Tomato', 'Populus trichocarpa')

编辑为不包括[]第二部分...这应该适用于与查询模式匹配的任何内容(例如,以名称开头,以 [] 中的内容结尾)它也将匹配 "Tomato4439, >gi|224089052|ref|XP_002308615.1| predicted protein [Populus trichocarpa apples]"例如

于 2012-09-13T18:06:55.927 回答
1
import re
a = "Tomato4439, >gi|224089052|ref|XP_002308615.1| predicted protein [Populus trichocarpa]"
re.sub(r"^([A-Za-z]+).+\[([^]]+)\]$", r"\1 \2", a)

这给

'Tomato Populus trichocarpa'
于 2012-09-13T18:07:11.440 回答
1

如果您尝试解析的字符串在语义上是一致的,那么您最好的选择可能是对您拥有的不同“类型”字符串进行分类,然后使用 python 的re模块创建正则表达式来解析它们。

于 2012-09-13T18:07:16.723 回答
1

以前的答案比我的简单,但是:

这是打印您不想要的东西的一种方法。

tag = "Tomato4439, >gi|224089052|ref|XP_002308615.1| predicted protein [Populus trichocarpa]"
import re, os
find = re.search('>(.+?) \[', tag).group(1)
print find

给你

gi|224089052|ref|XP_002308615.1| predicted protein

然后您可以使用替换功能将其从原始字符串中删除。以及用于删除多余不需要的字符的翻译功能。

tag2 = tag.replace(find, "")
tag3 = str.translate(tag2, None, ">[],")
print tag3

给你

Tomato4439  Populus trichocarpa
于 2012-09-13T18:19:58.590 回答