Использование регулярных выражений для поиска возврата каретки в середине предложения - PullRequest
1 голос
/ 04 февраля 2012

Я очень новичок в регулярных выражениях, но пока мне нравится его сила. Невероятно, хотя много чего можно понять.

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

У меня длинный документ в OpenOffice / LibreOffice. Автор использовал следующие плохие методы верстки, которые мне нужно удалить и / или исправить:

1) Пробелы в начале строк, используемые для отступа абзаца.

2) Пробелы в конце строк. Понятия не имею, почему они там.

3) Возврат каретки в середине предложения для принудительного переноса (я думаю). Я называю эти "поддельные ЧР". По сути, любой CR без предложения, определяющего пунктуацию (точка, вопросительный знак, восклицательный знак или любой из них с «после него»), является «поддельным CR» в этой ситуации. Если есть соответствующее предложение, определяющее пунктуацию перед CR, тогда Я считаю это подлинным ЧР и не хочу его удалять.

Я смог сделать №1 и №2 достаточно легко. Но № 3 поставил меня в тупик.

Мне удалось взломать что-то, что нашло бы то, что я хочу, но оно включало бы в себя последнюю букву строки, а не только CR. Таким образом, даже пустая замена избавит от CR, но также и от последней буквы.

Любая помощь будет принята с благодарностью.

Программное обеспечение, которое я использую для выполнения этого регулярного выражения, - TextSoap (на Mac). Насколько я могу судить, Regex - это «нормальный» способ, а не собственный нерегулярный поворот.

Я бы на самом деле хотел запустить результирующее регулярное выражение в Find-Replace в LibreOffice / OpenOffice, но он не принимает никаких стандартных вещей регулярных выражений, которые я добавляю. Они отлично работают в TextSoap, но не дают результатов в OO / LO. Не уверен почему - кажется, что OO не имеет стандартной реализации Regex (или я просто делаю что-то не так). Поэтому я сейчас копирую текст из документа LibreOffice в текстовое мыло, сортирую его и копирую обратно.

Спасибо ...

Jonathan

UPDATE: Для меня было бы целесообразно привести пример (извините, что забыл это сделать):

Здесь есть пример: http://best -mac-tips.com / wp-content / uploads / example.txt

Ответы [ 3 ]

2 голосов
/ 05 февраля 2012

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

(?<![\s.?!]"|[\s.?!])\s+

Функциональность TM regex обеспечивается библиотекой Oniguruma , которая принимает вид сзади, состоящий из двух или более альтернатив с разными, но фиксированными длинами. Или вы можете просто использовать это, которое должно работать в любом варианте, который поддерживает lookbehinds:

(?<![\s.?!]")(?<![\s.?!])\s+

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

^[ ]+|[ ]+$

... и заменить его ничем. (Скобки на самом деле не нужны, они просто облегчают чтение.)

0 голосов
/ 04 февраля 2012

То, что вам нужно, - это утверждение взгляда за :

s/(?<![.!?]"?)\n/ /

(заметьте, я думаю, вы хотите заменить пробел, или, может быть, два пробела, или это будет выглядеть смешно).

Возможно, вам также удастся заставить работать обратные ссылки.

0 голосов
/ 04 февраля 2012

Не видя примера, я думаю, что это сработает, чтобы найти любой \ n или \ r, не являющийся концом предложения:

 (.+?)([\n\r]+)(.+?[\.\?\!]+)

Объединение группы совпадений 1 и 3 с пробелом вернет нужную вам строку, я подозреваю.
(Обновлено, потому что по какой-то причине я предположил, что вы используете python ...)

Еще одно обновление: добавление \ s * перед первой группой захвата и после последней отфильтровывает эти отступы / пробелы.

\ S *? (. +?) ([\ П \ г] +) (. +? [. \ ?!] +) \ S *?

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