Регулярное выражение для замены следующих двух слов после точки совпадения

Я пишу регулярное выражение для замены максимум двух следующих слов после точки совпадения.

Ожидаемые префиксы: доктор, доктор, профессор, профессор.

Образец текста:

Обследование проводится по согласованию и в присутствии доктора. Джон Доу (ритмолог).

Ожидаемый результат:

Обследование проводится по согласованию и в присутствии доктора. [DOCTOR_NAME] (ритмолог).

Вот мое текущее регулярное выражение:

(\s|^|^(.*)|\()(dr|doctor|pr|professor)(\s|[.])(\s*([A-Z]\w+)){0,2}

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

Очень ценю помощь в улучшении Regex. Спасибо!

Что именно вы пытаетесь сопоставить и какова предполагаемая замена (если таковая имеется)?

Tim Biegeleisen 01.07.2024 10:18

@TimBiegeleisen Я пытаюсь сопоставить слова «доктор, доктор, профессор, профессор» в тексте, заменяя «[ИМЯ ДОКТОРА]» следующими двумя словами.

Januka samaranyake 01.07.2024 10:22

Вы уверены, что «Доктор»? в исходном тексте всегда следует имя и фамилия?

MonkeyZeus 01.07.2024 15:01

@MonkeyZeus Нет, это может быть только имя, мне интересно, как с этим справиться условно.

Januka samaranyake 02.07.2024 10:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Кажется, вы все усложняете, чем должно быть. Вы хотите, чтобы имя врача/специалиста соответствовало полному слову или сокращению, за которым следовали одно или два названия слов. Затем используйте этот шаблон:

\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].

Jeyekomon 01.07.2024 10:43

Это будет соответствовать следующим двум словам после профессора. и доктор. слишком. Пример: "What is the C constant?" - student asked the professor. The child was curious. Будет соответствовать professor. The child

Muslimbek Abduganiev 01.07.2024 10:43

Остановись прямо там. Regex не подходит для анализа грамматики. Для этого вам понадобится специализированная библиотека. Мой ответ выше действителен в соответствии с вашей первоначальной постановкой задачи, которая предполагает, что вы знаете, что следующие 1 или 2 слова принадлежат доктору/профессору. заголовок.

Tim Biegeleisen 01.07.2024 10:45

Я просто отмечаю, что необязательная точка подойдет и профессору, и доктору. И обычно только dr и pr могут иметь точку перед именем. Так что, возможно, \b(dr\b[.]?|doctor|pr\b[.]?|professor)\s+(\w+(?: \w+)?) немного лучше. Но я согласен, нужно быть уверенным, что для каждого отдельного случая совпадающих слов то, что следует после, — это то, что вам нужно.

Muslimbek Abduganiev 01.07.2024 11:00

@MuslimbekAbduganiev Согласен с вашим вторым комментарием... Поторопился с ответом и не заметил, что не все термины являются аббревиатурами.

Tim Biegeleisen 01.07.2024 11:05

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

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\.? в альтернативы; Я никогда не видел, чтобы слово «профессор» было сокращено до «Профессор».

Очевидно, это по-прежнему не удастся для профессора Ван Хельсинга, доктора де Хэвилленда, профессора Ффорбса-Ллойда, доктора Дж. Р. Р. Толкина и т. д. Возможно, см. Также Программисты верят в ложь об именах

Демо: https://ideone.com/oPhcNP

Другие вопросы по теме