Как удалить строчные фрагменты предложения из текста? - PullRequest
2 голосов
/ 13 марта 2010

Я пытаюсь удалить фрагменты предложений в нижнем регистре из стандартных текстовых файлов, используя регулярные выражения или простой Perl oneliner.

Их обычно называют, например, тегами речи или атрибуции - сказал он, сказала она и т. Д.

Этот пример показывает до и после использования ручного удаления:

  1. Оригинал:

"Ах, это совершенно верно!" воскликнул Алеша.

"О, перестань играть в дурака! Входит какой-то идиот, а ты нас Стыдно! - закричала девушка у окна, неожиданно повернувшись к отцу с презрительным и презрительным видом.

"Подожди немного, Варвара!" воскликнула ее отец, говоря безоговорочно, но глядя на них вполне одобрительно. "Это ее характер", сказал он, снова обращаясь к Алеше.

"Где ты был?" он спросил его.

«Я думаю, - сказал он, - я кое-что забыл ... мой платок, я думаю .... ну, даже если я ничего не забыл, позвольте мне остаться немного ".

Он сел. Отец стоял над ним.

"Вы тоже садитесь," сказал он.


  1. Все фрагменты строчных предложений удалены вручную:

«Ах, это совершенно верно!»

"О, перестань играть в дурака! Входит какой-то идиот, а ты нас позор! "

"Подождите немного, Варвара!" "Это ее характер"

"Где ты был?"

«Я думаю», «Я кое-что забыл ... мой платок, я думаю .... ну, даже если я ничего не забыл, позвольте мне остаться немного ".

Он сел. Отец стоял над ним.

"Вы тоже садитесь"


Я изменил прямые кавычки "на сбалансированные и пробовал:" (...) + [.]

Конечно, это удаляет некоторые фрагменты, но удаляет некоторый текст в сбалансированных кавычках и текст, начинающийся с заглавных букв. [^ A-Z] не работает в вышеприведенном выражении.

Я понимаю, что может быть невозможно достичь 100% точности, но любые полезные выражения, perl или python-скрипт будут высоко оценены.

* * Ура тысяча сорок-девять,

Aaron

Ответы [ 5 ]

3 голосов
/ 14 марта 2010

Вот фрагмент кода Python, который должен сделать:

 thetext="""triple quoted paste of your sample text"""
 y=thetext.split('\n')
 for line in y:
    m=re.findall('(".*?")',line)
    if m:
        print ' '.join(m)
    else:
        print line
0 голосов
/ 14 марта 2010

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

Вы можете использовать отладчик perl, чтобы поиграть с этим. Войдите в отладчик perl, набрав perl -de 42 в командной строке в linux / mac. («42» - это просто правильное выражение - это может быть что угодно, но почему бы не выбрать смысл жизни?)

в любом случае

open FILE, "<", "filename.txt" or die $!;
while (my $line = <FILE>) {
   @fixed_text = $line =~ m{(?:(" .+? ")) | (?:\A .* [^"] .* \z)}xmsg;
  for my $new_line (@fixed_text) {
    print qq($new_line );
  }
  print qq(\n);
}

ПРИМЕЧАНИЕ: Извините, я должен был отредактировать его - я не увидел нужных вам строк без кавычек вообще ...

Да, Regex и Perl потрясающие. Он должен быть на 100% точным и получать все ваши экземпляры, за исключением случая, когда цитата распространяется на параграфы

0 голосов
/ 14 марта 2010

Это работает для всех случаев, показанных в вопросе:

sed -n '/"/!{p;b}; s/\(.*\)"[^"]*/\1" /;s/\(.*"\)\([^"]*\)\(".*"\)/\1 \3/;p' textfile

Это не работает в таких случаях:

He said, "It doesn't always work."

"Secondly," I said, "it fails for three quoted phrases..." He completed my thought, "with two unquoted ones."

I replied, "That's right." dejectedly.
0 голосов
/ 14 марта 2010

Я не совсем уверен, какой редактор вы используете, если вы используете какой-то редактор, который поддерживает атомарную группировку (например, EditorPad Pro). Вы можете использовать приведенное ниже регулярное выражение для поиска и замены:

Поиск

(".+?"|^[A-Z].+\r\n)(.(?!"))* 
Note: you should replace \r\n with \n or \r according to your line breaks

Заменить на

\1

Вот небольшое объяснение регулярного выражения:

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

0 голосов
/ 14 марта 2010

Модуль Text::Balanced - это то, что вам нужно, если вы хотите использовать Perl. Следующее должно быть в состоянии извлечь всю цитируемую речь в вашем примере (не красиво, но выполняет свою работу).

Это также работает для тестовых случаев Денниса.

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

Сценарий

use strict;
use warnings;
use Text::Balanced qw/extract_quotelike extract_multiple/;

my %quotedSpeech;

{
    local $/ = '';
    while (my $text = <DATA>) { # one paragraph at a time

        while (my $speech = extract_multiple(
                            $text,
                            [sub{extract_quotelike($_[0])},],
                            undef,
                            1))
        {   push @{$quotedSpeech{$.}}, $speech; }
    }
}

# Print total number of paragraphs in DATA filehandle

print "Total paragraphs: ", (sort {$a <=> $b} keys %quotedSpeech)[-1];

# Print quotes grouped by paragraph:

foreach my $paraNumber (sort {$a <=> $b} keys %quotedSpeech) {
    print "\n\nPara ",$paraNumber;
    foreach my $speech (@{$quotedSpeech{$paraNumber}}) {
        print "\t",$speech,"\n";
    }
}
# How many quotes in paragraph 8?
print "Number of quotes in Paragraph 8: ", scalar @{$quotedSpeech{8}};

__DATA__

"Ах, это совершенно верно!" воскликнул Алеша.

"О, перестань играть в дурака! Приходит какой-то идиот, а ты нас позор! "закричала девушка у окна, вдруг поворачивается к отцу с презрительный и презрительный воздух.

"Подожди немного, Варвара!" плакала ее отец, говоря безоговорочно, но глядя на них вполне одобрительно. "Это ее характер", сказал он, снова обращаясь к Алеше.

"Где ты был?" он спросил его.

«Я думаю, - сказал он, - я забыл что-то ... мой платок, я думаю .... ну даже если бы я не забыл что-нибудь, позвольте мне остаться немного ".

Он сел. Отец стоял над ним.

"Вы тоже садитесь," сказал он.

Он сказал: «Это не всегда работает».

«Во-вторых, - сказал я, - это не помогает три процитированные фразы ... "Он закончил моя мысль, "с двумя без кавычек".

Я ответил: «Верно». подавленно.

выход

Total paragraphs: 10

Para 1  "Ah, that's perfectly true!"


Para 2  "Oh, do leave off playing the fool! Some idiot comes in, and you put us
to shame!"


Para 3  "Wait a little, Varvara!"
        "That's her character,"


Para 4  "Where have you been?"


Para 5  "I think,"
        "I've forgotten something... my handkerchief, I think.... Well, even if
I've not forgotten anything, let me stay a little."


Para 7  "You sit down, too,"


Para 8  "It doesn't always work."


Para 9  "Secondly,"
        "it fails for three quoted phrases..."
        "with two unquoted ones."


Para 10 "That's right."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...