我是一个文本文件的集合,它们都采用相同的格式(以下是一小段示例,实际文件更长):
Molecular weight = 43057.32 Residues = 391
Average Residue Weight = 110.121 Charge = -10.0
Isoelectric Point = 4.8926
Residue Number Mole% DayhoffStat
A = Ala 24 6.138 0.714
B = Asx 0 0.000 0.000
C = Cys 9 2.302 0.794
Property Residues Number Mole%
Tiny (A+C+G+S+T) 135 34.527
Small (A+B+C+D+G+N+P+S+T+V) 222 56.777
Aliphatic (A+I+L+V) 97 24.808
我需要提取所有这些变量并进行处理。我打算编写一些代码,逐行处理并通过一系列的分割、去空格等函数提取相关信息。
这是人们经常使用 Python 完成的一个任务,因此我开始思考是否有更简单的方法来完成这个任务。
是否存在任何模块或方法可以允许像下面这样的操作:
template = """
Molecular weight = {0} Residues = {1}
Average Residue Weight = {2} Charge = {3}
Isoelectric Point = {4}
Residue Number Mole% DayhoffStat
A = Ala {4} {5} {6}
B = Asx {7} {8} {9}
C = Cys {10} {11} {12}
Property Residues Number Mole%
Tiny (A+C+G+S+T) {14} {15}
Small (A+B+C+D+G+N+P+S+T+V) {16} {17}
Aliphatic (A+I+L+V) {18} {19}"""
然后,要从符合上述格式的另一个输入文件中提取变量,您需要执行以下操作:
list_of_vars = Parse(template, infile)
请注意,同一行中的同一变量将在每个文件中出现,但是根据该行上前面的值有多大,它们可能会向右移动几个字符。
这些文件是从emboss pepstats的输出中获得的,如果有人想知道的话。
解决方案: 感谢大家快速回复。这里的解决方案是使用re模块中的findall函数。以下是一个简单的示例:
import re
class TemplateParser:
def __init__(self, template):
self.m_template = template.replace('{}', r'[\s]*([\d\-\.]+)[\s]*')
def ParseString(self, filename):
return re.findall(self.m_template, filename, re.DOTALL|re.MULTILINE)[0]
template = """
Molecular weight = {} Residues = {}
Average Residue Weight = {} Charge = {}
Isoelectric Point = {}
Residue Number Mole% DayhoffStat
A = Ala {} {} {}
B = Asx {} {} {}
C = Cys {} {} {}
Property Residues Number Mole%
Tiny \(A\+C\+G\+S\+T\) {} {}
Small \(A\+B\+C\+D\+G\+N\+P\+S\+T\+V\) {} {}
Aliphatic \(A\+I\+L\+V\) {} {}"""
ParseString函数成功返回一个字符串列表,我可以对其进行处理。由于文件格式始终相同,我能够成功处理所有文件。但是,我遇到了两个问题。
1)如上所述,我必须转义模板文件中的所有正则表达式字符,这并不是什么大问题。
2)正如我上面提到的,这个模板只是我需要解析的实际文件的一小部分。当我尝试使用我的真实数据时,re抛出了以下错误:
"sorry, but this version only supports 100 named groups" AssertionError: sorry, but this version only supports 100 named groups
我通过将模板字符串分成三个部分来解决了这个问题,使用三个不同的模板运行ParseString函数,并将列表结果相加。
再次感谢!
(?:\s*([a-zA-Z()+ ]+?)[ =]*)([-+]?\d+\.?\d*)
。在此处查看其使用情况:https://regex101.com/r/dimHON/1 - ctwheels