У меня есть такой текст:

После жизни во французском дипломатическом корпусе граф де Груз жил со своей женой в элегантном таунхаусе на набережной Вольтера. Он был приятным человеком, культивируемым, конечно, с заслуженной репутацией щедрого хозяина и забавного raconteur.

Я хочу найти все правильное дело с помощью регулярного поиска. Мое исключение является надлежащим случаем после точки, как

. He

У меня есть поиск в интернете и я нашел этот вход

[a-z] [A-Z][\w]*

Проблема в том, что вы можете отметить Quai не всеми 2 или 3 словами, как Quai Voltaire, и как я могу исключить какой-то подходящий случай, как я, я, мой ...?

Как я могу это сделать?

3 ответа3

1

Я согласен с Андреасом. Теперь, если это одноразовая задача, которую можно разбить на несколько этапов, я бы предложил сначала временно исключить исключения, возможно, используя неиспользуемый в противном случае символ, а затем отложить его позже. Вот находка и замена:

\b(I|God|Dad)\b
@\1

Это дает нам что-то вроде этого (обратите внимание, что я и мой не пишутся с заглавной буквы на английском языке):

Did @I write this to @God, @Dad, or my wife? After a lifetime in the 
French diplomatic corps, the Count de Gruse lived with his wife 
in an elegant townhouse on Quai Voltaire! He was a likeable man, 
cultivated of course, with a well-deserved reputation as a 
generous host and an amusing raconteur.

Оттуда вы можете использовать регистрозависимое регулярное выражение и отрицательный взгляд сзади, чтобы найти заглавные слова, перед которыми стоит один или несколько пробелов, не следующих за границей предложения:

 (?<![.?'!"])[ ]+[A-Z]

Обратите внимание, что это не сработает для текста, заключенного в твердую оболочку, такого как «французский» в примере, который я показал выше.

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

Сказав это, вот то, что вы просили, включив также негативные взгляды, чтобы сделать все это за один шаг. :)

(?<![.?'!"]) (?!Dad\b|God\b|I\b)[A-Z]

СОВЕТ: если вы не используете или не предпочитаете использовать флажок с учетом регистра, вы можете поставить его в начале регулярного выражения:

(?c)
0

Когда я добавлю

[\w]*

тогда мое регулярное выражение

(?<![.?'!"]) (?!Dad\b|God\b|I\b)[A-Z][\w]*

Работает отлично

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .