我正在学习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
减去最后三位数)。这可以用正则表达式完成吗?或者,其他一些策略?然后我将这些代码和术语保存到另一个哈希中。
感谢您抽出时间来阅读!任何建议将不胜感激!
答案 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