簡體   English   中英

通過正則表達式匹配連續重復的單詞

[英]Matching repeating words in a row by regex

我想在字符串中找到一個替換重復單詞,但前提是它們彼此相鄰或由空格分隔。 例如:

"<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"\1", label).strip()\

請參閱正則表達式演示 詳情

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

\1是對 Group 1 值的替換反向引用。

Python 測試

import re
text = '"<number> <number>", "<number><number>", not "<number> test <number>"'
print( re.sub(r"(<number>)(?:\s*<number>)+", r'\1', text) )
# => "<number>", "<number>", not "<number> test <number>"

您可以使用

(<number>\s*){2,}
  • (<number>\s*)捕獲組 1 ,匹配<number>后跟可選字符
  • {2,}重復 2 次或更多次

在替換使用組 1 中。

正則表達式演示

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"\1", s))

Output

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM