Python中如何删除首个指定实例后的所有字符串字符?
哈哈周五下午脑子离线太懂这种感觉了!我帮你搞定这个字符串拆分转DataFrame的事儿~
解决思路:用正则精准匹配拆分字段
观察你给的示例字符串,结构其实很固定:登录号 + 物种/菌株信息 + 质粒名称 + 序列类型,用正则表达式就能精准把每个字段抠出来,然后直接转成DataFrame。
具体代码实现
先上完整可运行的代码,之后再拆解说细节:
import pandas as pd import re # 你的示例字符串列表 seq_strings = [ "NC_002523_1 Serratia entomophila plasmid pADAP, complete sequence.", "NZ_CM003366_0 Pantoea ananatis strain CFH 7-1 plasmid CFH1-7plasmid2, whole genome shotgun sequence.", "NZ_CP014491_0 Escherichia coli strain G749 plasmid pG749_3, complete sequence." ] # 定义正则匹配模式,对应四个要提取的字段 pattern = r'^(\w+_\d+_\d+) (.*?) plasmid (.*?), (.*?)\.?$' # 提取所有字符串的匹配结果,转成DataFrame df = pd.DataFrame( [re.match(pattern, s).groups() for s in seq_strings], columns=["登录号", "物种/菌株信息", "质粒名称", "序列类型"] ) # 打印看看结果 print(df)
代码细节拆解
正则模式为啥这么写?
^(\w+_\d+_\d+):匹配开头的登录号(比如NC_002523_1),\w匹配字母/数字,\d匹配数字,下划线直接匹配,完美覆盖你给的登录号格式(.*?):非贪婪匹配物种和菌株信息,直到遇到plasmid就停,这样不会把后面的质粒名也包含进来(.*?):匹配质粒名称,直到遇到,就停,刚好截到质粒名的结尾(.*?)\.?$:匹配最后的序列描述,\.?是处理结尾可能有的句号,$确保匹配到字符串最后
DataFrame生成:用列表推导式遍历每个字符串,把每个匹配到的字段组转成列表,再指定列名,直接就得到结构化的表格啦!
运行效果
输出的DataFrame会是这样的结构化内容:
登录号 物种/菌株信息 质粒名称 序列类型 0 NC_002523_1 Serratia entomophila pADAP complete sequence 1 NZ_CM003366_0 Pantoea ananatis strain CFH 7-1 CFH1-7plasmid2 whole genome shotgun sequence 2 NZ_CP014491_0 Escherichia coli strain G749 pG749_3 complete sequence
要是你的实际字符串有一些小变体(比如个别没有strain关键词,或者序列描述格式不一样),可以微调正则模式来适配,不过看你给的示例,当前模式完全够用~
内容的提问来源于stack exchange,提问作者Joe Healey
相关产品推荐
相关产品推荐

