使用正则表达式查找名称

时间:2011-10-04 20:58:38

标签: regex

为了在大文本中查找姓名,我有以下正则表达式

([A-Z][a-z]*)[\s-]([A-Z][a-z]*)

这适用于像“Jack Oneill”或“John Guidetti”这样的普通人名字。但是我想找到一些拥有的东西,却找不到。像:

Chandler Murial Bing
Gandalf the Gray
Pieter van den Woude

我对正则表达式的有限知识似乎无法得到这种怀疑。谁能帮助我(请为此提供一个好的网站/书):))

2 个答案:

答案 0 :(得分:14)

解决正则表达式问题的最佳方法是描述您要查找的匹配项(通常称为语法)。

例如,根据您的问题,我可能会将其描述如下:

  1. 大写单词定义为一个大写字母和1+个字母/短划线或一个大写字母和一个.(一个首字母)。
  2. 非大写单词被定义为1个字母和1个字母/短划线(不完美,因为这可能允许以破折号结束)。
  3. 第一个单词以大写字母开头
  4. 最后一个单词以大写字母结尾
  5. 0 +第一个和最后一个词之间的大写单词
  6. 然后 0-2第一个大写单词和最后一个单词之间没有大写的单词
  7. 至少两个字。
  8. 单词被空格打破
  9. 如果这提供了与所需结果集相当接近的匹配(并且要清楚,对于名称,有很多变体,您将有误报或漏报),那么您开始构建表达式:

    1. 大写单词:[A-Z]([a-z]+|\.)
    2. 未大写的字:[a-z][a-z\-]+
    3. 结果:

       [A-Z]([a-z]+|\.)(?:\s+[A-Z]([a-z]+|\.))*(?:\s+[a-z][a-z\-]+){0,2}\s+[A-Z]([a-z]+|\.)
      

      匹配(粗体):

        

      您好我的名字是 Chandler Muriel Bing 。我有一个名叫 Pieter van den Woude 的朋友,他有另一个朋友, A. A.米尔恩 Gandalf the Gray 加入我们。我们一起组成 Friends Cast and Crew

      问题:

      • 因为你想要匹配 Gandalf the Grey Pieter van den Woude ,你将不可避免地匹配其他由名称中包含非大写字母的集合(Friends Cast和Crew) )。上述语法试图通过将问题限制为 2 非大写单词来限制问题。你也可以创建一组允许的非大写单词(“van”,“der”,“the”),并且只匹配这些单词。
      • 不允许使用非拉丁字母,连字,diacritics
      • 正如我和其他人所指出的那样,正则表达式对于这种情况永远不会是完美的,但正如你所说,你想要的东西可以让你在那里大部分时间。在这种情况下,上面的表达应该做得很好,但认为它是钝器!你被警告了。

答案 1 :(得分:0)

在您的情况下,只需添加另一个

[\s-]([A-Z][a-z]*)

一般来说,正则表达式不适合这个问题,有太多特殊情况,你需要建立这些名称的列表。

对于复杂名称,您可以参考[自然语言处理]:http://en.wikipedia.org/wiki/Natural_language_processing