通过正则表达式连续匹配重复的单词

Matching repeating words in a row by regex

我想找到替换字符串中重复的单词,但前提是它们彼此相邻或由 space 分隔。例如:

"<number> <number>" -> "<number>"
"<number><number>"-> "<number>"

但不是

"<number> test <number>" -> "<number> test <number>"

我试过这个:

import re
re.sub(f"(.+)(?=\<number>+)","", label).strip()

但它会给出最后一个测试选项的错误结果。

你能帮我解决一下吗?

您可以使用

re.sub(r"(<number>)(?:\s*<number>)+",r"", label).strip()\

参见regex demo详情:

  • (<number>) - 第 1 组:一个 <number> 字符串
  • (?:\s*<number>)+ - 以下模式序列出现一次或多次:
    • \s* - 零个或多个空格
    • <number> - <number> 字符串

</code> 是第 1 组值的替代反向引用。</p> <p><a href="https://ideone.com/714ral" rel="nofollow noreferrer">Python test</a>:</p> <pre><code>import re text = '"<number> <number>", "<number><number>", not "<number> test <number>"' print( re.sub(r"(<number>)(?:\s*<number>)+", r'', text) ) # => "<number>", "<number>", not "<number> test <number>"

您可以使用

(<number>\s*){2,}
  • (<number>\s*) 捕获 组 1,匹配 <number> 后跟可选字符
  • {2,}重复2次或更多次

在替换使用组1中。

Regex demo

import re

strings = [
    "<number> <number>",
    "<number><number>",
    "not <number> test <number>",
    " <number>   <number><number>  <number>     test"
]

for s in strings:
    print(re.sub(r"(<number>\s*){2,}", r"", s))

输出

<number>
<number>
not <number> test <number>
 <number>     test