2013-08-04 2 views
2

У меня есть текст, который разбивается на многие строки, без определенных форматов. Поэтому я решил сделать line.strip('\n') для каждой строки. Тогда я хочу, чтобы разделить текст на предложения с использованием предложений конечных маркеров . с учетом:Согласование предложений с регулярным выражением

  1. периода ., что сопровождается \s (пробелом), \S (как "') и затем [A-Z] разделятся
  2. не разделить [0-9]\.[A-Za-z], как 1.stackoverflow real time solution.

Моя программа решает только половину 1-период (.), За которой следуют \ s и [A-Z]. Ниже приведен код:

# -*- coding: utf-8 -*- 
import re, sys 

source = open(sys.argv[1], 'rb') 
dest = open(sys.argv[2], 'wb') 
sent = [] 
for line in source: 
    line1 = line.strip('\n') 
    k = re.sub(r'\.\s+([A-Z“])'.decode('utf8'), '.\n\g<1>', line1) 
    sent.append(k) 

for line in sent: 
    dest.write(''.join(line)) 

Pls! Я хотел бы знать, что является лучшим способом для управления регулярным выражением. Кажется, это сбивает с толку.

+1

Два действительно хороших ресурса для регулярных выражений: http://www.regular-expressions.info/tutorial.html и http: // manual. macromates.com/en/regular_expressions – GreatBigBore

+0

Также хорошо: http://www.pyregex.com/ –

ответ

3

Чтобы включить одиночную кавычку в класс символов, сбегите с нее \. Регулярное выражение должно быть:

\.\s+[A-Z"\']

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

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

Это предполагает, что регулярное выражение, которое у вас было, работало, чтобы разделить период, за которым следует пробел, за которым следует капитал, как вы сказали. Обратите внимание, однако, что это означает, что I am Sam. Sam I am. разделится на I am Sam и am I am. Это действительно то, что вы хотите? Если нет, используйте утверждения с нулевой шириной, чтобы исключить части, которые вы хотите сопоставить, но также сохраняете. Вот ваши варианты, в порядке того, что я думаю, что это, скорее всего, вы хотите.

1) Держите период и первую букву или открытую цитату следующего предложения; потерять пробельные:

(?<=\.)\s+(?=[A-Z"\'])

Это расколоть пример выше в I am Sam. и Sam I am.

2) Держите первую букву следующего предложения; потерять период и пропуски:

\.\s+(?=[A-Z"\'])

Это разделится на I am Sam и Sam I am. Это предполагает, что после этого есть больше предложений, иначе период останется со вторым предложением, потому что за ним не следуют пробелы и заглавная буква или цитата.Если этот параметр - тот, который вы хотите - предложения без периодов, то вы можете также указать период, за которым следует конец строки, с необязательным промежуточным пробелом, так что конечный период и любые конечные пробелы будут отбрасывается:

\.(?:\s+(?=[A-Z"\'])|\s*$)

Обратите внимание на ?:. Вам нужно, не захваченным, потому что если у вас есть захват группы в расколе, все захвачено группой добавляется в качестве элемента в результатах (например split('(+)', 'a+b+c' дает массив a+b+c, а не только abc) ,

3) Держите все; пробельный идет с предыдущим предложением:

(?<=\.\s+)(?=[A-Z"\'])

Это даст вам I am Sam. и Sam I am.

Что касается последней части вашего вопроса, лучший ресурс для регулярных выражений синтаксиса я видел http://www.regular-expressions.info. Начните с этого резюме: http://www.regular-expressions.info/reference.html Затем перейдите на страницу учебного пособия для более подробной информации: http://www.regular-expressions.info/tutorial.html

+0

Если вы используете это выражение для разделения строки, тогда вы не потеряете период и, что более важно, первый символ из следующей строки в процесс разделения? Возможно, было бы лучше использовать прогноз, например '\. \ S + (? = [AZ" \ ']) '. –

+0

Я бы так подумал - это показалось бы более полезным для меня и, кажется, подразумевается, но он сказал, что его регулярное выражение * работает так, как он ожидал «половины 1» (т. е. все это, потому что № 2 был конкретным случаем того, что он не хочет сопоставлять, что не нужно указывать). Единственное, чего не хватало, это сбежавшая одинарная цитата. Я подумал, что это не то, что он хотел, чтобы он мог вернуться и сказать это, но это противоречило бы тому, что он сказал о разрешении расщепления на период, за которым следуют пробелы, за которыми следует капитал. Но я отредактирую ответ, чтобы включить все варианты полноты. –

+0

Привет, регулярное выражение '\. \ S + ([AZ "\']) 'расставляет предложение, но я замечаю следующие ошибки, такие как расщепление [0- 9]. [AZ], а не расщепление '. после "", за которым следует [A-Z]. Как в этом случае: «Под руководством Отца Он был создателем земли. «Все было создано им; и без него не было сделано ничего, что было сделано »(Иоанна 1: 3).« Я сожалею о какой-либо задержке. Спасибо @ Все. Я попробовал выражение ожидания и получил: sre_constants.error: неверная ссылка на группу. – Iykeln

Смежные вопросы