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 Здравствуйте, мне нужно заменить слова "sus"
и "su"
, чтобы они были внутри ((PERSON)
этой строки )
, и получить результат, который я указал в вопросе. Проблема в том, что я не знаю, с какой комбинацией шаблонов регулярных выражений мне следует это делать. Ммм... Я не могу вставить регулярное выражение re.sub()
, которое позволяет мне получить этот вывод
Вместо того, чтобы пытаться сделать все это в одном re.sub
(что может потребовать, чтобы ваше регулярное выражение было очень сложным), возможно, попробуйте перебирать совпадения (например, for m in re.finditer(subject_capture_pattern, input_text): ...
) и внутри цикла просто применяйте замены к соответствующему фрагменту строки.
@TimGoodman Нет необходимости, чтобы шаблон идентификации был только один. На самом деле я думал разделить строку, используя ((PERS) )
в качестве разделителя. А потом в каждой из частей заменила бы местоимения "sus"
и "su"
на то, что внутри ((PERS) replace with this name)
. Есть несколько способов сделать это, но нужно позаботиться о том, чтобы все "sus"
или "su"
были заменены на имя в пределах ближайшего предшествующего PERS
(и точно неизвестно, сколько их будет в input_string
)
Я добавил ответ ниже, который, я думаю, поможет вам в этом. (Я построил новую строку из кусочков исходной строки, но вы можете сделать что-то подобное после разделения строки, как вы предлагаете.)
@TimGoodman Если бы я тестировал код вашего ответа, он работал очень хорошо. Затем я попытаюсь использовать re.sub() с двумя группами захвата, чтобы изменить порядок информации о контексте. Действительно спасибо за помощь
Это показывает способ замены 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
Моя стратегия была:
Каков ваш вопрос об этой задаче? Есть ли проблема с вашим кодом?