Ruby - 从电子邮件地址中查找文本中的姓氏和姓氏

时间:2014-01-24 05:19:26

标签: ruby regex

这是我一直在玩的一个有趣的问题但无法找到答案。

我有一个非结构化数据的文本文件,其中包括电子邮件和全名。我已经提取了电子邮件,但我也希望将姓名和姓氏映射到每封电子邮件中。

所以假设电子邮件是ksmith@gmail.com,页面上的某个地方是'Kevin Smith'。

我想使用'@'前面的任何内容来映射文本中某处的全名。但显然搜索“ksmith”将不会返回任何匹配项。那么,从左边开始,我会搜索一个较少的字符,即'smith',它会匹配。

但是当我找到'史密斯'时,我也想找到第一个名字。所以也许假设这将永远是姓氏(因为大多数电子邮件有最后但不是名字)并从“史密斯”向左搜索,直到到达下一个空格(在'凯文'面前)并确定它之间是什么在'史密斯'之前和'凯文'之前的空间。

但是,如果全名是“Kevin Michael Smith”或“Kevin P. Smith”怎么办?在这种情况下,我不想要“迈克尔”或“P。”,而是凯文作为名字。

或者如果电子邮件结构是smithk@gmail.com,在这种情况下,从左边缩小子字符串永远不会匹配,我也需要从另一边尝试。

基本上我需要一种足够智能的方法来识别这些全名。

任何帮助将不胜感激!

我正在尝试在Ruby中执行此操作,如果这有帮助

2 个答案:

答案 0 :(得分:1)

当你找到姓氏时,你会回到第一个名字,所以不要向左移动'史密斯',直到到达下一个空格,你应该看看第一个字母后面是否有空格例如你的“Kevin P. Smith”算法的下一个名字会找到“P”。但如果检查“P”后面是否有空格,则查找名称的下一部分。所以对于“凯文迈克尔约翰史密斯”你会得到凯文,因为首先你到达“约翰”然后你看到“J”后面有空间所以你再次回到“迈克尔”有空间绑定“M”所以你移动到“凯文”。由于凯文背后没有空间,所以你有了第一个名字。

最简单的解决方案是使用Split功能,例如

string_=string_.split(" ");
firstName=string_[0];

答案 1 :(得分:0)

我的建议是编写一个算法,它创建一个全名数组。例如:

a = ["kevin smit", "andrew john", "thom devid", "M. K. Add","k smith"]
b= "ksmith@gmail.com"
c = b.split('@')[0]
=> "ksmith" 
first = c[0]
=> "k"
last = c[1..c.length]
=> "smith" 

a.each do |i|
  if i.gsub(" ").count == 1
    if (i.split(" ")[0][0] == first && i.split(" ")[1] == last) ||   (i.split(" ")[0][0] == last && i.split(" ")[1] == first)
       p i
    end
  elsif i.gsub(" ").count == 2
    if (i.split(" ")[0][0] == first && i.split(" ")[2] == last) ||   (i.split(" ")[0][0] == last && i.split(" ")[2] == first)
       p i.split(" ")[0] +  i.split(" ")[2]
    end
  end
end

这对你有用。如果有多个场景,你可以使用if-else的switch-case