Я пишу регулярное выражение для замены максимум двух следующих слов после точки совпадения.
Ожидаемые префиксы: доктор, доктор, профессор, профессор.
Образец текста:
Обследование проводится по согласованию и в присутствии доктора. Джон Доу (ритмолог).
Ожидаемый результат:
Обследование проводится по согласованию и в присутствии доктора. [DOCTOR_NAME] (ритмолог).
Вот мое текущее регулярное выражение:
(\s|^|^(.*)|\()(dr|doctor|pr|professor)(\s|[.])(\s*([A-Z]\w+)){0,2}
Однако здесь не учитывается закрывающая скобка, как показано на следующем рисунке:
Очень ценю помощь в улучшении Regex. Спасибо!
@TimBiegeleisen Я пытаюсь сопоставить слова «доктор, доктор, профессор, профессор» в тексте, заменяя «[ИМЯ ДОКТОРА]» следующими двумя словами.
Вы уверены, что «Доктор»? в исходном тексте всегда следует имя и фамилия?
@MonkeyZeus Нет, это может быть только имя, мне интересно, как с этим справиться условно.
Кажется, вы все усложняете, чем должно быть. Вы хотите, чтобы имя врача/специалиста соответствовало полному слову или сокращению, за которым следовали одно или два названия слов. Затем используйте этот шаблон:
\b(dr|doctor|pr|professor)\b[.]?\s+(\w+(?: \w+)?)
и замените на это:
$1 [$2]
Пояснение к узору:
\b(dr|doctor|pr|professor)\b
название матча[.]?
необязательная точка\s+
один или несколько пробельных символов(\w+(?: \w+)?)
затем сопоставьте и запишите $1
одно или два названия словЯ думаю, что результат для dr Martin Smith
должен быть dr [DOCTOR_NAME]
.
Это будет соответствовать следующим двум словам после профессора. и доктор. слишком. Пример: "What is the C constant?" - student asked the professor. The child was curious.
Будет соответствовать professor. The child
Остановись прямо там. Regex не подходит для анализа грамматики. Для этого вам понадобится специализированная библиотека. Мой ответ выше действителен в соответствии с вашей первоначальной постановкой задачи, которая предполагает, что вы знаете, что следующие 1 или 2 слова принадлежат доктору/профессору. заголовок.
Я просто отмечаю, что необязательная точка подойдет и профессору, и доктору. И обычно только dr и pr могут иметь точку перед именем. Так что, возможно, \b(dr\b[.]?|doctor|pr\b[.]?|professor)\s+(\w+(?: \w+)?)
немного лучше. Но я согласен, нужно быть уверенным, что для каждого отдельного случая совпадающих слов то, что следует после, — это то, что вам нужно.
@MuslimbekAbduganiev Согласен с вашим вторым комментарием... Поторопился с ответом и не заметил, что не все термины являются аббревиатурами.
Чтобы несколько снизить риск ложных срабатываний, возможно, следует сопоставлять только точку после сокращения и сопоставлять только слова, начинающиеся с заглавной буквы.
re.sub(
r'\b((?:[Pp]rofessor|[Dd]octor|[DdPp]r\.?)\s+)([A-Z](?:\.|\w*)(?:\s+[A-Z]\w*)?)\b',
r'\1[DOCTOR NAME]',
input_text)
Я бы, возможно, также включил [Pp]rof\.?
в альтернативы; Я никогда не видел, чтобы слово «профессор» было сокращено до «Профессор».
Очевидно, это по-прежнему не удастся для профессора Ван Хельсинга, доктора де Хэвилленда, профессора Ффорбса-Ллойда, доктора Дж. Р. Р. Толкина и т. д. Возможно, см. Также Программисты верят в ложь об именах
Что именно вы пытаетесь сопоставить и какова предполагаемая замена (если таковая имеется)?