regex 将某个单词的所有出现替换为另一个特定单词,该单词必须出现在句子中该单词之前的某个位置

tv6aics1  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(149)
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"),则将sussu替换为((PERSON) NO DATA)
句子是从左到右读取的,因此替换将是"sus""su"之前的圆括号((PERSON)the substring)内的子字符串,如示例所示。
最后,替换的子字符串应该以如下结构结束:
associated_info_capture_pattern + "((CONTEXT)" + subject_capture_pattern + ")"

bt1cpqcv

bt1cpqcv1#

这展示了一种按照您的要求替换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

相关问题