regex 如何删除连续重复的字符串,只要这个字符串是在中间的“((动词)”和“)"?

izkcnapc  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(102)
import re

input_text = "((VERB) saltar a nosotros a nosotros) a nosotros a nosotros a nosotros ((VERB)correr a nosotros) sdsdsd ((VERB) saltar a nosotros a nosotros)"

input_text = re.sub(r"\(\(VERB\)" + r"((?:\w\s*)+)" + r"\)", 
                    lambda x: re.sub(r"(a nosotros)\s*\1+", r"\1", x.group()), 
                    input_text)

print(input_text) # --> output

在这段代码中,我尝试删除连续重复的"a nosotros"字符串,但前提是该字符串位于"((VERB)")"的中间,即捕获捕获组r"\(\(VERB\)" + r"((?:\w\s*)+)" + r"\)"的字符串
以下是运行此脚本时应获得的输出:

"((VERB) saltar a nosotros) a nosotros a nosotros a nosotros ((VERB)correr a nosotros) sdsdsd ((VERB) saltar a nosotros)"

虽然我放在问题中的代码确实编辑了输入字符串,但是我应该修改什么呢?

mm5n2pyu

mm5n2pyu1#

您可以使用

input_text = re.sub(r"\(\(VERB\)[\w\s]*\)",  lambda x: re.sub(r"\ba nosotros(?:\s+a nosotros)*\b", "a nosotros", x.group()), input_text)

主要模式是\(\(VERB\)[\w\s]*\),它匹配((VERB)+零个或多个单词或空白字符,然后匹配)字符。
re.sub(r"\ba nosotros(?:\s+a nosotros)*\b", "a nosotros", x.group())部分移除匹配中的所有连续的整字a nosotros

yquaqz18

yquaqz182#

Python的可选正则表达式引擎模块(由Matthew巴内特开发)支持\K指令,该指令将报告的匹配的起始点重置为当前的字符串指针位置,并从最终匹配中丢弃任何先前使用的字符,通过使用该指令,用户可以简单地用空字符串替换字符串中的匹配。
完成此操作的代码如下所示。

import regex

rgx = r"\(\(VERB\)(?:(?!\ba nosotros\b|\)).)*\K\ba nosotros\b(?=[^)]*\ba nosotros\b)"

txt_in = "((VERB) saltar a nosotros a nosotros) a nosotros a nosotros a nosotros ((VERB)correr a nosotros) sdsdsd ((VERB) saltar a nosotros a nosotros)"

txt_out = regex.sub(rgx, '', txt_in)

print(txt_out)
-> ((VERB) saltar  a nosotros) a nosotros a nosotros a nosotros ((VERB)correr a nosotros) sdsdsd ((VERB) saltar  a nosotros)

正则表达式可以分解如下。

\(\(VERB\)          # match literal
(?:                 # begin non-capture group
  (?!               # begin negative lookahead
    \ba nosotros\b  # match literal surrounded by word boundaries
    |               # or 
    \)              # match literal 
  )                 # end of negative lookahead
  .                 # match any character other than a line terminator
)*                  # end non-capture group and execute zero or more times
\K                  # see the first paragraph of this answer
\ba nosotros\b      # match literal surrounded by word boundaries
(?=                 # begin positive lookahead
  [^)]*             # match any characters other than ')' zero or more times
  \ba nosotros\b    # match literal surrounded by word boundaries
)                   # end positive lookahead

〈-\()/-〉
一次匹配一个字符的负前瞻(这里是(?:(?!\ba nosotros\b|\)).))技术被称为调节贪婪令牌解决方案。

相关问题