Разбор имен с помощью регулярного выражения Perl - PullRequest
2 голосов
/ 24 февраля 2012

Попытка написать регулярное выражение, которое может проанализировать полное имя и разделить его на имя, отчество, фамилию.Это должно быть легко, но довольно сложно, когда ты видишь имена, которые мне нужно разобрать.Теперь я мог бы написать большое длинное регулярное выражение, которое учитывает все эти разные случаи, но я думаю, что возможно меньшее динамическое регулярное выражение, и поэтому я здесь прошу помощи.

Я думаю, что это все типыимен, которые мне нужно взять.

Вот некоторые примеры имен, которые нужно проанализировать (у каждого по три запятых в конце):

(first name) (middle intial). (last name),,, //one middle initial with period after
(first name) (last name),,,                  //simple first and last
(No name),,,                                 //no name
(first name) (last name)-(last name),,,      //two last names separated by a dash
(first name) (middle initial). (middle initial). (last name),,,   //two middle initials with space inbetween
(first name) (last name w/ apostrophe),,,    //Last names with apostrophes 
(first name) (Middle name) (Last name),,,    //first middle and last name

Ответы [ 3 ]

4 голосов
/ 24 февраля 2012

Вы не можете разобрать то, что в конечном итоге не следует никаким правилам и надеетесь на успех.Проблема не в том, чтобы перевести алгоритм в регулярное выражение, а в том, чтобы написать алгоритм для начала.

Подумайте: как бы вы написали алгоритм, который мог бы правильно проанализировать все эти имена в именах заданных, средних и фамилий?

  • Боб Мак Интош
  • Мэри Джейн Уотсон
  • Терстон Пауэлл III
  • Майкл ван дер Фельден
  • Жаклин Кеннеди Онассис
  • Др.Джин Грей
  • Такахаси Широ
  • Мишель Ла Фонтен
  • сэр Алек Гиннесс
  • Мэри-Сью Боуэс-Лион
  • Саша Барон Коэн
  • Джек Арнольд младший

Понимаете, о чем я?Вам понадобится ИИ, чтобы правильно распределить каждое из этих слов в нужном контексте.Некоторые люди используют два имени в качестве своего «данного» имени.Некоторые люди используют названия или honififics, и некоторые культуры помещают свою фамилию сначала и дают фамилию.

Резюме: Не делайте этого.Если вы не можете заставить пользователя разделить его имя на отдельные фрагменты, вы должны рассматривать их как атомы.

3 голосов
/ 24 февраля 2012

Нет кода, но попробуйте:

  1. используйте substr для удаления последних трех символов из $ name,
  2. @ array = split /[\s+.]+/, $name # разделить на пробел и / или точки (как упомянуто выше) в массив,
  3. if ($ array [0]), тогда у вас есть a name,
  4. $ lastname = pop @array;# получает последнее (или единственное) имя
  5. $ firstname = shift @array if scalar @array;# first name is first element
  6. @ array теперь содержит все вторые имена и / или инициалы

Что-то в этом роде, в любом случае ...

3 голосов
/ 24 февраля 2012
use 5.010;
use DDS;
for (<DATA>) {
    chomp;
    s/,,,.*//;
    if (' ' eq $_) {
        say 'no name';
    } else {
        /\A (?<first>\S+) \s+ (?<middle>.*?)? (?:\s+)? (?<last>\S+) \z/msx;
        DumpLex \%+;
    }
}

__DATA__
Foo B. Baz,,,
Fnord Quux,,,
 ,,,
Xyzzy Bling-Bling,,,
Abe C. D. Efg,,,
Ed O'postrophe,,,
First Middle Last,,,

$HASH1 = {
           first  => 'Foo',
           last   => 'Baz',
           middle => 'B.'
         };
$HASH1 = {
           first  => 'Fnord',
           last   => 'Quux',
           middle => ''
         };
no name
$HASH1 = {
           first  => 'Xyzzy',
           last   => 'Bling-Bling',
           middle => ''
         };
$HASH1 = {
           first  => 'Abe',
           last   => 'Efg',
           middle => 'C. D.'
         };
$HASH1 = {
           first  => 'Ed',
           last   => 'O\'postrophe',
           middle => ''
         };
$HASH1 = {
           first  => 'First',
           last   => 'Last',
           middle => 'Middle'
         };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...