2016-12-09 3 views
2

У меня есть несколько статей, посвященных террористическим атакам. Из этих статей я хотел бы выделить конкретный пункт.Извлечение абзаца из статей | Регулярное выражение

Это образец статей Царапины:

By DAVID D. KIRKPATRICK MARCH 18, 2015 
Scenes from Tunisian state television showed confusion outside an art museum and Parliament on Wednesday after gunmen attacked. 
CAIRO — Gunmen in military uniforms killed 19 people on Wednesday in a 
midday attack on a museum in downtown Tunis, dealing a new blow to the tourist industry 
that is vital to Tunisia as it struggles to consolidate the only transition to democracy 
after the Arab Spring revolts. 
Tunisian officials had initially said that the attackers took 10 
hostages and killed nine people, including seven foreign visitors and two Tunisians. 

То, что я хочу, чтобы извлечь для дальнейшего анализа, является текст, который идет, в данном примере, из: «КАИР -» к первому fullstop.

This is the regular expression, что я придумал:

([A-Z]+(?:\W+\w+)?)\s*—[\s\S]+\.\s 

С помощью этого регулярного выражения я извлечь только начальную точку пункта, но я не извлекаю остальное.

+0

Является ли регулярное выражение более или менее, чем вы хотите? (мое подозрение в том, что он слишком много извлекает, потому что вы не использовали ленивый [квантификатор] (http://www.regular-expressions.info/repeat.html)). –

+0

Вы правы. Я пытаюсь выдать только первый абзац, начинающийся после заглавного слова и знака. Когда я применяю его к целому набору данных, я извлекаю слишком много. –

+0

. Это сбивает с толку - вы указываете «до первого полного перерыва». и это то, что вы получаете. Чего ты действительно хочешь? – ClasG

ответ

2

Применение нежадным

(([A-Z]+(?:\W+\w+)?)\s*—[\s\S]+?\.\s) 

? после + (или *) делает его нежадным. Это означает, что он будет соответствовать как можно меньше, а не нормальному поведению, где он будет соответствовать как можно больше.

0

EDIT1:

попробовать регулярное выражение следующим образом:

([A-Z]+\w+\s*—\s*.*?\.) 

Речь идет о группировке, хотя она совпадает с текстом, который вы хотите.

попробуйте следующее регулярное выражение (окружать регулярное выражение с parenthisis):

(([A-Z]+(?:\W+\w+)?)\s*—[\s\S]+\.\s) 

Группа 1 содержит необходимую строку/текст.

ссылка Изображение: enter image description here

+0

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

+0

означает, что это соответствует нескольким разным группам? можем ли мы сделать код CAIRO? можете ли вы обновить код, с фактической проблемой? –

+1

Просто используйте не жадную версию! '(? ([A-Z] + (: \ W + \ W +)) \ S * - [\ s \ S] + \ \ с?.)'. См. '?' После '+' – Fallenhero