Замените все вхождения слова другим конкретным словом, которое должно стоять где-то в предложении перед этим словом

import re

#example 1
input_text = "((PERSON)María Rosa) ((VERB)pasará) unos dias aqui, hay que ((VERB)mover) sus cosas viejas de aqui, ya que sus cosméticos ((VERB)estorban) si ((VERB)estan) tirados por aquí. ((PERSON)Cyntia) es una buena modelo, su cabello es muy bello, hay que ((VERB)lavar) su cabello"

#example 2
input_text = "Sus útiles escolares ((VERB)estan) aqui, me sorprende que ((PERSON)Juan Carlos) los haya olvidado siendo que suele ((VERB)ser) tan cuidadoso con sus útiles."

#I need replace "sus" or "su" but under certain conditions
subject_capture_pattern = r"\(\(PERSON\)((?:\w\s*)+)\)" #underlined in red in the image
associated_info_capture_pattern = r"(?:sus|su)\s+((?:\w\s*)+)(?:\s+(?:del|de )|\s*(?:\(\(VERB\)|[.,;]))" #underlined in green in the image

identification_pattern = 
replacement_sequence = 

input_text = re.sub(identification_pattern, replacement_sequence, input_text, flags = re.IGNORECASE)

это правильный вывод:

#for example 1
"((PERSON)María Rosa) ((VERB)pasará) unos dias aqui, hay que ((VERB)mover) cosas viejas ((CONTEXT) de María Rosa) de aqui, ya que cosméticos ((CONTEXT) de María Rosa) ((VERB)estorban) si ((VERB)estan) tirados por aquí. ((PERSON)Cyntia) es una buena modelo,  cabello ((CONTEXT) de Cyntia) ((VERB)es) muy bello, hay que ((VERB)lavar) cabello ((CONTEXT) de Cyntia)"

#for example 2
"útiles escolares ((CONTEXT) NO DATA) ((VERB)estan) aqui, me sorprende que ((PERSON)Juan Carlos) los haya olvidado siendo que suele ((VERB)ser) tan cuidadoso con útiles ((CONTEXT) Juan Carlos)."

Подробности:

Замените притяжательные местоимения "sus" или "su" на "de " + the content inside the last ((PERSON) "THIS SUBSTRING"), а если перед ним нет ((PERSON) "THIS SUBSTRING"), то замените sus или su на ((PERSON) NO DATA)

Предложения читаются слева направо, поэтому заменой будет подстрока внутри круглых скобок ((PERSON)the substring) перед этим "sus" или "su", как показано в примере.

В итоге замененные подстроки должны иметь такую ​​структуру:

associated_info_capture_pattern + "((CONTEXT)" + subject_capture_pattern + ")"

Каков ваш вопрос об этой задаче? Есть ли проблема с вашим кодом?

mkrieger1 11.02.2023 10:31

@ mkrieger1 Здравствуйте, мне нужно заменить слова "sus" и "su", чтобы они были внутри ((PERSON) этой строки ), и получить результат, который я указал в вопросе. Проблема в том, что я не знаю, с какой комбинацией шаблонов регулярных выражений мне следует это делать. Ммм... Я не могу вставить регулярное выражение re.sub(), которое позволяет мне получить этот вывод

Matt095 11.02.2023 10:34

Вместо того, чтобы пытаться сделать все это в одном re.sub (что может потребовать, чтобы ваше регулярное выражение было очень сложным), возможно, попробуйте перебирать совпадения (например, for m in re.finditer(subject_capture_pattern, input_text): ...) и внутри цикла просто применяйте замены к соответствующему фрагменту строки.

Tim Goodman 11.02.2023 12:01

@TimGoodman Нет необходимости, чтобы шаблон идентификации был только один. На самом деле я думал разделить строку, используя ((PERS) ) в качестве разделителя. А потом в каждой из частей заменила бы местоимения "sus" и "su" на то, что внутри ((PERS) replace with this name). Есть несколько способов сделать это, но нужно позаботиться о том, чтобы все "sus" или "su" были заменены на имя в пределах ближайшего предшествующего PERS (и точно неизвестно, сколько их будет в input_string)

Matt095 11.02.2023 12:17

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

Tim Goodman 11.02.2023 12:33

@TimGoodman Если бы я тестировал код вашего ответа, он работал очень хорошо. Затем я попытаюсь использовать re.sub() с двумя группами захвата, чтобы изменить порядок информации о контексте. Действительно спасибо за помощь

Matt095 11.02.2023 12:39
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это показывает способ замены su/sus, как вы просили (хотя и не только с одним re.sub). Я не перемещал дополнительную информацию, но вы также можете изменить ее, чтобы справиться с этим.

import re

subject_capture_pattern = r"\(\(PERSON\)((?:\w\s*)+)\)"

def replace_su_and_sus(input_text):
    start = 0
    replacement = "((PERSON) NO DATA)"
    output_text = ""
    for m in re.finditer(subject_capture_pattern, input_text):
        output_text += re.sub(r"\b[Ss]us?\b", replacement, input_text[start:m.end()])
        start = m.end()
        replacement = m.group(0).replace("(PERSON)", "(CONTEXT) de ")
    output_text += re.sub(r"\b[Ss]us?\b", replacement, input_text[start:])
    return output_text

Моя стратегия была:

  • До захвата первого субъекта замените su/sus на «NO DATA».
  • Вплоть до второго захвата субъекта замените su/sus именем из первого захвата.
  • Действуйте аналогичным образом для каждого последующего захвата объекта.
  • Наконец, замените любой su/sus между последним захватом субъекта и концом строки.

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

Невозможно напечатать диапазон результатов с пробелом между каждыми тремя результатами
Как мне добавить tqdm или аналогичный индикатор выполнения в этот многопроцессорный скрипт?
Есть ли способ создать несколько вложенных списков на определенную глубину?
Tkinter- Как остановить цикл, который находится в другом файле, с помощью кнопки остановки?
Как узнать, закрыл ли пользователь окно tkinter?
Объединить два отсортированных массива с использованием цикла for, в котором отсутствует последний элемент
Самый быстрый способ создать новый столбец в фрейме данных pandas, который удовлетворяет двум условиям
Как сопоставить данные со связанных страниц вместе с помощью веб-скрапинга
Selenium Как продолжить, если не найден
Проверьте, равно ли значение столбца строки значениям в текущем или других столбцах для других строк того же фрейма данных