为什么这种具有负面前瞻性的模式不限制 re.sub() 函数的这些覆盖?

问题描述 投票:0回答:0

Haciendo uso de un negative lookahead X(?!Y), revisar que NO este delante de la coincincia, el objetivo es identificar las substring "ellos" que no tengan por delante alguna secuencia ((PERS)los, y si no hay ninguna entonces que reemplace esa substring "ellos" por la string "((PERS)ellos NO DATA)". En caso contrario no debe hacer ningún reemplazo.

import re

# Example 1 :
input_text = "Ellos son grandes amigos, los cellos de ellos, pronto ellos se convirtieron en mejores amigos. ellos se vieron en el parque antes de llevar los viejos gabinetes, ya que ((PERS)los impresoras) eran aun útiles para la compañía ellos. Ellos son algo peores que los nuevos modelos."
# Example 2 :
input_text = "Ellos terminaron bastante rápido el diagrama de flujo"

input_text = re.sub(r"\(\(PERS\)\s*los", "((PERS)los", input_text)

#constraint_pattern = r"\bellos\b(?<!\(\(PERS\)/s*los)" # --> re.error: look-ahead requires fixed-width pattern
constraint_pattern = r"\bellos\b(?<!\(\(PERS\)los)"

input_text = re.sub(constraint_pattern,
                    "((PERS)ellos NO DATA)", 
                    input_text, flags = re.IGNORECASE)
print(input_text) # --> output

使用这段代码,出于某种原因,所有出现的 "ellos" 子串都被 "((PERS)ellos NO DATA)" 替换,但实际上只有 "ellos" 前面没有序列 "((PERS)los" 的子串必须被 "((PERS)ellos NO DATA)"

替换

目标真的是得到这个输出

#correct output for example 1
"((PERS)ellos NO DATA) son grandes amigos, los cellos de ((PERS)ellos NO DATA), pronto ((PERS)ellos NO DATA) se convirtieron en mejores amigos. ((PERS)ellos NO DATA) se vieron en el parque antes de llevar los viejos gabinetes, ya que ((PERS)los impresoras) eran aun útiles para la compañía ellos. Ellos son algo peores que los nuevos modelos."

#correct output for example 2
"((PERS)ellos NO DATA) terminaron bastante rápido el diagrama de flujo"
python python-3.x regex regex-group regex-lookarounds
© www.soinside.com 2019 - 2024. All rights reserved.