如何使用Ruby从哈希中提取相关数字(代码)?

时间:2014-03-31 18:11:26

标签: ruby hash extract

我正在学习Ruby,我正在尝试应用Ruby从哈希中提取相关代码,并且不了解如何在哈希中识别它们。代码已从2014 Mesh Tree Codes网站的NLM文件中提取。代码与MeSH条款相关联,并在文件中显示如下(使用术语“运动活动”作为示例):

  

运动活动; F01.145.632

我将这些信息放在哈希中,使用代码作为键,术语作为值。我需要使用他们的代码提取相关术语;父级将包含三个更少的数字,兄弟姐妹将具有不同的最后三位数,并且子级将具有完全相同的代码加上.XXX.XXX;形式的任何数量的附加数字,这些代码的示例如下:< / p>

Motor Activity [F01.145.632]
Behavior and Behavior Mechanisms [F01]              
Behavior [F01.145]
Information Seeking Behavior [F01.145.535]          
Inhibition (Psychology) [F01.145.544]           
Freezing Reaction, Cataleptic [F01.145.632.555]     
Immobility Response, Tonic [F01.145.632.680]

到目前为止,我已打开文件并将代码保存为键,将术语保存为值。脚本如下:

mesh = File.open('mtrees2014.bin').read
mesh.gsub!(/\r?\n/)
mesh.each_line do |line|
  line.chomp!
  mesh_descriptor, tree_code = line.split(/\;/)
  descriptor_code_hash[tree_code] = "#{mesh_descriptor}"
end

我需要了解如何提取第一个词(motor activity:F01.145.632),然后是兄弟姐妹(F01.145.632,后三位数不同),孩子(F01.145.632,其中包含任意数量的附加数字来自散列的.XXX.XXX)和父母(F01.145.632减去最后三位数)。这可以用正则表达式完成吗?或者,其他一些策略?然后我将这些代码和术语保存到另一个哈希中。 感谢您抽出时间来阅读!任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

motor_code = 'F01.145.632'

parents = descriptor_code_hash.select do |k, v|
  motor_code[/^#{k}/] && motor_code != k 
end.map { |k, v| v }
# => ["Behavior and Behavior Mechanisms", "Behavior"] 

siblings = descriptor_code_hash.select do |k, v| 
  k =~ /^#{motor_code.split('.')[0..-2].join('\.')}\.\d{3}/ && k != motor_code 
end.map { |k, v| v }
# => ["Information Seeking Behavior", "Inhibition (Psychology)", "Freezing Reaction, Cataleptic", "Immobility Response, Tonic"]

children = descriptor_code_hash.select do |k, v| 
  k =~ /^#{motor_code}\.[\d\.]*/ 
end.map { |k, v| v }
# => ["Freezing Reaction, Cataleptic", "Immobility Response, Tonic"] 
通过查找前缀parents的所有键,可以找到

motor_code。 通过查找以siblings的父键为前缀的所有键找到motor_code(删除最后三位数,并期望完全三位数。) 通过查找以children

为前缀的所有密钥,可以找到motor_code