2011-03-22 24 views
1

我有一个字符串,其中包含很多我想从中提取的字段。 这些我可以很容易地从正则表达式解析,但我想一次抓住它们。从一系列正则表达式捕获返回所有匹配

我的字符串是:

>sp|P31946-2|1433B_HUMAN Isoform Short of 14-3-3 protein beta/alpha OS=Homo sapiens GN=YWHAB 

我想用这样的:

id, entry, protein, organism, gene, existence, seq_version = (1..6).each do |i| 
    line[/^>sp\|(\w*)\|(\w*)\s(.*)\sOS=(.+)\sGN=(.+)\sPE=(\d*)\sSV=(\d*)/, i] 
end 

主要是,我只是想有一行代码来捕获所有的这些来自条目字符串的属性。有没有办法做到这一点?

+1

其中一个主要的目标,为编写代码是使可读性和可维护性。试图将所有逻辑合并到一行代码中,都会违反这些目标,所以要小心,按照您的程序,您不要试图变得聪明或大胆,并且在将来您的代码难以理解,或者其他人必须重新访问代码以进行一些修改。当逻辑分布在多行时,代码很多时候仍然更具可读性。 – 2011-03-23 06:04:40

+0

如果您提供了预期输出/捕获文本的样本,这将有很大帮助。您的示例正则表达式不正确,因此它不匹配。 – 2011-03-23 06:15:47

+0

我将代码从单行转换为三行。道歉,如果它使得它更少“1337”。 – 2011-03-23 06:20:57

回答

2

也,

>> "THX1138".scan(/(.)(.)(\d+)(\d)/) 
=> [["H", "X", "113", "8"]] 
+0

我喜欢这个根据我的范例对对象进行操作,并且减少了方法调用的次数。 – Ryanmt 2011-03-23 19:11:16

3

MatchData#captures

f1,f2,f3,f4 = /(.)(.)(\d+)(\d)/.match("THX1138.").captures 
f1 #=> "H" 
f2 #=> "X" 
f3 #=> "113" 
f4 #=> "8" 
相关问题