python 如果字符串位于模式之后、另一模式之前,则用另一字符串替换该字符串

inb24sb2  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(133)
import re

input_text = "Creo que ((PERS)los viejos gabinetes) estan en desuso, hay que hacer algo con ellos. ellos quedaron en el deposito de afuera, lloviznó temprano por lo que ((PERS)los viejos gabinetes) fueron llevados a la sala principal."

pattern_01 = r"((PERS)\s*los\s[\w\s]+)(\.)"
output = re.sub(pattern_01, r"\1, \1\3", input_text, flags = re.IGNORECASE)

print(output)

((PERS)\s*los )序列后第一个点.之前的任何"ellos"子字符串替换为括号((PERS)\s*los )内的内容,这些内容必须在出现该子字符串"ellos"之前找到
直接使用此代码不会修改字符串
但我需要得到这个输出:

"Creo que ((PERS)los viejos gabinetes) estan en desuso, hay que hacer algo con los viejos gabinetes. ellos quedaron en el deposito de afuera, lloviznó temprano por lo que ((PERS)los viejos gabinetes) fueron llevados a la sala principal."

必须执行替换的次数是未知的,也就是说,在((PERS)ellos )和这个字之后的第一个点.之间可能有多于一个"ellos"

whlutmcx

whlutmcx1#

您可以尝试以下操作:

import re

re_block = re.compile(
    r"""
      (                  # 1. group recorded because it's kept
        \(
          \(PERS\)\s*
          ( los[^\)]* )  # Recplacment string in 2. group
        \)
      )
      ( [^\.]* )         # 3. group: part in which `ellos` gets replaced
    """,
    re.VERBOSE
)
re_ellos = re.compile(r"\bellos\b")

def repl(match):
    return match[1] + re_ellos.sub(match[2], match[3])

output_text = re_block.sub(repl, input_text)

相关问题