gpt4 book ai didi

ruby - 从 Ruby 中的文本正文中提取值

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:55 25 4
gpt4 key购买 nike

我需要从多行字符串(我从电子邮件的正文中读取)中提取一些值。我希望能够将模式提供给我的解析器,以便以后可以自定义不同的电子邮件。我想出了以下内容:

#!/usr/bin/env ruby

text1 =
<<-eos
Lorem ipsum dolor sit amet,

Name: Pepe Manuel Periquita

Email: pepe@manuel.net

Sisters: 1
Brothers: 3
Children: 2

Lorem ipsum dolor sit amet
eos

pattern1 = {
:exp => /Name:[\s]*(.*?)$\s*
Email:[\s]*(.*?)$\s*
Sisters:[\s]*(.*?)$\s*
Brothers:[\s]*(.*?)$\s*
Children:[\s]*(.*?)$/mx,
:blk => lambda do |m|
m.flatten!
{:name => m[0],
:email => m[1],
:total => m.drop(2).inject(0){|sum,item| sum + item.to_i}}
end
}

# Scan on text returns
#[["Pepe Manuel Periquita", "pepe@manuel.net", "1", "3", "2"]]

def do_parse text, pattern
data = pattern[:blk].call(text.scan(pattern[:exp]))

puts data.inspect
end


do_parse text1, pattern1

# ./text_parser.rb
# {:email=>"pepe@manuel.net", :total=>6, :name=>"Pepe Manuel Periquita"}

因此,我将模式定义为与 block 配对的正则表达式,以从匹配中构建散列。 “解析器”简单地获取文本并通过对使用扫描将正则表达式与文本进行匹配的结果执行 block 来应用规则。

目前我必须解析格式如 text1 所示的电子邮件,但稍后我想尽可能轻松地添加模式以从不同的电子邮件中提取数据(这些电子邮件的格式将针对每种类型固定)。因此,我想简化模式,尽可能多地移动到“解析器”。上面的代码工作并提取数据,但大部分工作位于模式...

这是正确的方法吗?

可以简化吗?或者您认为这个问题有不同/更好的解决方案吗?

更新

我按照 Tonttu 解决方案更新了解析器,所以模式哈希现在是:

pattern2 = {
:exp => /^(.+?):\s*(.+)$/,
:blk => lambda do |m|
r = Hash[m.map{|x| [x[0].downcase.to_sym, x[1]]}]

{:name => r[:name],
:email => r[:email],
:total => r[:children].to_i + r[:brothers].to_i + r[:sisters].to_i}
end
}

最佳答案

也许像这样的东西就足够通用了?

pp Hash[*text1.scan(/^(.+?):\s(.+)$/).map{|x|
[x[0].downcase.to_sym, x[1]]
}.flatten]

=>
{:sisters=>"1",
:brothers=>"3",
:children=>"2",
:name=>"Pepe Manuel Periquita",
:email=>"pepe@manuel.net"}

关于ruby - 从 Ruby 中的文本正文中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4800562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com