удалить каждое второе слово из строки, используя perl? - PullRequest
3 голосов
/ 31 августа 2011

Как лучше всего удалять каждое второе слово (или лучше: строку, отделенную от соседних строк пробелом) из строки текста в perl?

из этого:

  1. Mn Gordon Npmsc Snell Npmsc.Fe

Я хотел бы получить только это:

  1. Гордон Снелл.

I 'мы пытались написать регулярное выражение, моделирующее это, но пока не получилось.Любые предложения будут оценены!

Ответы [ 5 ]

4 голосов
/ 31 августа 2011

Что-то подобное сделает это:

my $i = 0;
my $line = "Mn Gordon Npmsc Snell Npmsc . Fe";
my @words = grep { $i++ % 2 } split /\s+/, $line;
print "@words\n"; # "Gordon Snell ."

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

3 голосов
/ 31 августа 2011

Не уверен, что это наиболее эффективный способ, но для простоты я бы, вероятно, просто позвонил бы split во входной строке, а затем перебрал бы токены, печатая / сохраняя только каждый второй токен:

my $sentence = "Once sdklf upon asdfk a lkdfj time...";
my $i = 0;
map { print "$_ " unless $i++ % 2; } (split /\s+/, $sentence);

Приведенный выше код печатает следующее:

Once upon a time... 
2 голосов
/ 31 августа 2011

Вы можете сделать что-то вроде s/\s+\S+(\s+|$)/$1/g, но это не очень читабельно. Вероятно, было бы яснее (если немного более многословно) набрать split на пустом месте и явно выбирать / печатать / что угодно для каждого второго элемента результирующего списка.

1 голос
/ 01 сентября 2011

Если сохранение пробелов не имеет значения, в качестве однострочника работает следующее:

$ perl -pale '$_ = "@F[ grep { !($_ % 2) } 0..$#F ]"' input.dat

Тестирование предоставленного образца:

$ echo "1. Mn Gordon Npmsc Snell Npmsc . Fe" | perl -pale '$_ = "@F[ grep { $_ % 2 } 0..$#F ]"'

выход

1. Gordon Snell .
1 голос
/ 31 августа 2011

s/(\s*\S+\s+)\S+\s*/$1/g, кажется, доставит вас туда, сохранив пробел в начале строки и после последнего неотвеченного слова.Не ясно, хотите ли вы сохранить пробелы до или после удаленного слова (или имеет ли это значение).

foreach $a (
    "1. Mn Gordon Npmsc Snell Npmsc . Fe",
    "i've tried to write a regular expression modeling this,",
    "but i've failed so far. any suggestions appreciated!"
    ) {

    $_=$a;
    s/(\s*\S+\s+)\S+\s*/$1/g;
    print "$_\n";

}

1. Gordon Snell .
i've to a expression this,
but failed far. suggestions
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...