Не могли бы вы сказать мне, как я могу извлечь первые N (например, 30) слов каждого абзаца в тексте? Может быть с регулярным выражением?
3 ответа
Как я сказал в своем комментарии, много важной информации отсутствует. Следующее извлечет первые 30 слов каждого абзаца из простого текстового файла и будет работать как и в любом * nix (Linux, OSX, Unix etx).
В качестве примера я сохраню этот текст как file.txt
:
Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit. Nulla at diam commodo turpis dictum porttitor. Нунц велит масса, портиттор сит амет рутрум вел, импердиет эгэ сем. Pellentesque neque porttitor elit fringilla pretium. Sed sed Felis Quam. Pellentesque pellentesque lorem non libero feugiat sollicitudin. В утреннем следствии. Phasellus sed arcu mi, vitae dictum arcu. Quisque lectus massa, tempus vitae elementum nec, adipiscing ut risus.
Donec в lacus urna, sed dictum lectus. Donec pharetra quam sed augu ornare aliquam. Aenean Mollis Velit Eu Justo Scelerisque elementum. Энеан на лореме у элитного вестибюля malesuada. Aliquam sollicitudin volutpat massa et convallis. Ut eget ipsum vitae dolor ullamcorperperctetur. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Quisque elit nisi, volutpat quis malesuada ac, приправа в квам. Morbi sagittis varius felis в аликвам. Nullam interdum tempor lorem bibendum. Cras lacinia rhoncus massa ac tempor.
Pellentesque fringilla, ante a hendrerit iaculis, mauris sem placerat felis, vitae ultrices nisl lorem ac ligula. Sed viverra nunc quis dui dictum porta Tellus Semper. Aenean felis sapien, dictum et luctus quis, mattis at massa. Nam lacus magna, suscipit at contectetur ut, mollis at sem. Nam euismod mi a nulla rutrum placerat. Nulla dignissim facilisis turpis et faucibus. Donec libero eros, venenatis congue volutpat id, fringilla in felis. Ut vulputate, tellus sed malesuada varius, dolor ligula elementum leo, eu faucibus nulla erat at nisi.
Аликвам Эрат Волутпат. Nulla convallis, leo sit amet placerat lacinia, nisl lectus tempor mi, id pharetra ipsum sapien varius nulla. Nam mollis, nulla at molestie gravida, neque libero consequat odio, nec aliquam tellus arcu ullamcorper quam. Etiam a ligula nec augue dignissim elementum. Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit. Maecenas facilisis hendrerit sodales. Sed lobortis tincidunt accumsan. В nunc massa, varius в транспортном средстве, placerat сидеть amet elit.
Fusce sed dui ante. Mauris purus est, rhoncus in cursus sit amet, претиум портиттор магна. Sed dapibus, nisl in hendrerit, hendrerit, purus libero accumsan lectus, в конце концов лигула. Phasellus accumsan est non magna sagittis iaculis является элитной элитой. Vestibulum posuere massa quis neque pharetra at elementum justo condimentum. Donec malesuada enim a nulla mattis auctor. Morbi scelerisque, neque hendrerit lobortis eleifend, turpis quam adipiscing arcu, convallis accumsan lectus neque vitae eros. Maecenas sapien magna, fringilla eu pharetra hendrerit, varius vitae turpis.
Запуск этого маленького Perl-скрипта выведет первые 30 слов каждого абзаца (между абзацами должны быть пустые строки):
$ perl -e 'while(<>){
chomp; $par.=$_;
if (/^\s*$/){
@a=split(/\s/,join("",$par));
print "@a[0..29]\n\n";
$par="";
next;
}
}
@a=split(/\s/,join("",$par));
print "@a[0..29]\n";' file.txt | fold -s
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla at diam commodo
turpis dictum porttitor. Nunc velit massa, porttitor sit amet rutrum vel,
imperdiet eget sem. Pellentesque a neque porttitor
Donec in lacus urna, sed dictum lectus. Donec pharetra quam sed augue ornare
aliquam. Aenean mollis velit eu justo scelerisque elementum. Aenean at lorem at
elit vestibulum malesuada. Aliquam sollicitudin
Pellentesque fringilla, ante a hendrerit iaculis, mauris sem placerat felis,
vitae ultrices nisl lorem ac ligula. Sed viverra nunc quis dui dictum a porta
tellus semper. Aenean felis sapien, dictum
Aliquam erat volutpat. Nulla convallis, leo sit amet placerat lacinia, nisl
lectus tempor mi, id pharetra ipsum sapien varius nulla. Nam mollis, nulla at
molestie gravida, neque libero consequat odio,
Fusce sed dui ante. Mauris purus est, rhoncus in cursus sit amet, pretium
porttitor magna. Sed dapibus, nisl in hendrerit hendrerit, purus libero
accumsan lectus, at gravida erat sem a
Есть много способов сделать это, некоторые проще, некоторые сложнее. Если вы обновите свой вопрос с вашими конкретными требованиями, я обновлю свой ответ.
В текстовом редакторе Sublime Text 2 вы можете использовать следующее регулярное выражение для сопоставления первых 30 слов каждого абзаца в текстовом файле:
^((([^ \n]+) ?){1,30})
Чтобы удалить все остальное, найдите ^((([^ \n]+) ?){1,30}).*
И замените на $1
. Это отбрасывает все после первых 30 слов в каждом абзаце.
Как указывает Тердон, ваша проблема довольно неопределенно указана. Если мы предположим, что "текст" содержит абзацы, которые разделены пустыми строками, а "слово" - это последовательность символов слова, как это определено в используемой разновидности регулярного выражения, следующий пример (в Python) может помочь вам начать (текст отсюда):
>>> import re
>>> pattern = r"(?:^|\n\n)((?:\W*\w+){,30})"
>>> for x in re.findall(pattern, text):
... print(x)
... print("---")
...
Loop quantum gravity (LQG) is a theory that attempts to describe the
quantum properties of gravity. It is also a theory of quantum space
and quantum time, because, as discovered
---
More precisely, space can be viewed as an extremely fine fabric or
network "woven" of finite loops. These networks of loops are called
spin networks. The evolution of a spin
---
Today LQG is a vast area of research, developed in several directions,
which involves about 50 research groups world wide.[1] They all share
the basic physical assumptions and the
---
Several research directions study the physical consequences of the
theory. Among these, the most developed is the application of LQG to
cosmology, called Loop quantum cosmology (LQC). LQC applies LQG
---
>>>
Регулярное выражение используется в коде выше:
(?:^|\n\n)((?:\W*\w+){,30})
... имеет несколько частей. Во-первых, (?:^|\n\n)
соответствует либо началу текста ^
, либо паре новых строк \n\n
(пустая строка, другими словами). Затем последовательность из нуля или более несловесных символов \W*
за которыми следует один или несколько словосочетаний \w+
, сопоставляется от нуля до тридцати раз {,30}
. (?:
)
круглые скобки группе различные части регулярного выражения , не позволяя им быть "захвачена" на re.findall()
и голые (
Скобки сигнал , что эта часть регулярного выражения должна быть захватили.