2009-10-14 3 views
3

Я получаю регулярное выражение (совместимое с php/perl), чтобы получить первое предложение из некоторого текста. Я понимаю, что это может стать огромным, если охватить все случаи, но только после того, что на данный момент будет «достаточно хорошим». Кто-нибудь получил что-то от полки для этого?Первое предложение регулярных выражений

+5

Определите «первое предложение». – Rob

+1

Достаточно хорошо для * what *? –

ответ

4

хорошо, /^[^.]+/ является самым простым один

+0

Да, у меня было это, ну у меня были strpos ($ content, '.'), Но, например, или [email protected] не так хорошо, не говоря уже о вопросах? – Tim

+2

Я закончил с /^.{150,}?[.?!]+(?=\s|$)/, поскольку я хотел, чтобы действительно короткие предложения были упущены. Спасибо также Крису Лутцу, который хорошо объяснил сложности проблемы. – Tim

+0

P.S. И если нет совпадения, я делаю preg_replace ('/ \ s +? (\ S +)? $ /', '', Substr ($ content, 0, $ max_length = 200)) .'... '; сломать первое пространство после 200 символов. – Tim

1

Если приговор «строка», то просто соответствовать первому ^.* из куска текста. По умолчанию DOT не соответствует новым строковым символам.

Если это действительно первое предложение, сделать что-то вроде этого: ^[^.!?]*

0

Я знаю, что вы просто хотите что-нибудь, что работает сейчас, но this mailing list post придумал /^[^\.]*\.\s/ и subsequent post придумали ([\s\S]+?)\.(|\r|\n).

Хотя эти шаблоны кажутся подходящими только для периодов, это зависит от вас, если вы хотите изменить его так же, как и для других типов знаков препинания, таких как восклицательные знаки и знаки вопросов.

+0

Что относительно предложений, которые заканчиваются с помощью '!' Или '?'. –

+0

Вот что я сказал в своем посте, хе-хе. –

+0

Тогда можно использовать это:/\ A (. +?) [.?!] (| \ R | \ n)/s – leticia

0
/\A(.+?)[.?!] /s 

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

+1

Так много для г-на Реджекса и его предложения. –

+0

Прошу прощения? – SilentGhost

+0

Проверьте свое регулярное выражение на это - он будет анализировать как два предложения из-за г-на –

0

Это работает в .NET:

/(?<=^\s*)(?!\s)("(\<'.*?'\>|.)*"|.)*?((?<='*"*)|[.?!]+|$)(?=\ \ |\n\n|$)/s 

Ручки кавычки (в американском стиле) («, как это„ и это“Да, с пунктуацией» и кавычки) и предложений заканчивая несколькими пунктуациями. Также игнорирует предыдущие пробелы. Тем не менее, требуется два пробела или два конца строки и конец файла после предложений.

Ручки следующие хорошо:

Так много для г Regex и его соответствия предложения, как он говорит, «это предложение, это не замечательно Один говорит:«Это почти как если бы это было проработано? например, чисто ». Однако эта часть не должна совпадать.

+1

Так много для мистера Реджекса и его приговора. –

+0

@ Луц, так много для него. – strager

+0

Вы проверили его? Я не думаю, что PHP поддерживает внешний вид переменной длины. – SilentGhost

3

Это не просто регулярное выражение, но я написал функцию Python для этого: Separating sentences. Обработка естественного языка, как известно, сложна, поэтому есть случаи, когда это неправильно относится к делу, но это хорошо справляется с некоторыми сложными случаями.

+0

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

5

В конце концов, вам нужно провести естественный анализ языка, что крайне сложно сделать и, возможно, невозможно для регулярных выражений (даже супер-супых PCRE). Рассмотрите это предложение:

Так много для г-на Реджекса и его подходящего предложения.

Каждый ответ, полученный до сих пор, проанализирует это как два предложения, и это даже не так много случаев с краем - вполне разумно представить блок текста, начинающийся с «Уважаемый г-н Адамс:» или что-то вроде того. Вы можете прикоснуться к lookbehinds, чтобы проверить, что слово перед знаками пунктуации было, но это будет недостижимо, так как вы должны проверить на все возможные сокращения. Вы должны проверить г-на и т. Д. и co. и Св. и для многих других, о которых вы никогда не подумаете. Через некоторое время у вас может получиться «довольно хорошее» практическое решение, но оно будет уродливым, и однажды он потерпит неудачу.

+0

Мое решение, похоже, работает и не очень уродливо. Однако он предполагает два пробела после каждого предложения. Он также не обрабатывает кавычки. – strager

+1

Два пробела после каждого предложения хороши, если люди следуют за ним (я ненавижу его и никогда этого не делаю, поэтому, возможно, я просто предвзятый). Но ваше регулярное выражение - это точная точка, на которой я остановлюсь и говорю: «Это не работа для регулярных выражений». –

+0

Я должен согласиться, что регулярные выражения не являются подходящим инструментом для работы. Но это достаточно хорошо для quick'n'dirty, и если это нужно сделать только один раз, но тысячу раз, регулярное выражение с коррекцией человека является IMO более эффективным, чем полный парсер языка (если не существует уже синтаксического анализатора, который используется) , – strager

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