【问题标题】:Matching repeating words in a row by regex通过正则表达式匹配连续重复的单词
【发布时间】:2022-01-19 10:07:40
【问题描述】:

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

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

但不是

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

我试过这个:

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

但它会为最后一个测试选项提供错误的结果。

你能帮我解决这个问题吗?

【问题讨论】:

  • 可能是re.sub(r"(&lt;number&gt;)(?:\s*&lt;number&gt;)+",r"\1", label).strip() (demo)?
  • 您是否因为要使用动态变量而尝试使用 f 字符串?还是 '' 是需要替换的静态子字符串?

标签: python regex python-re


【解决方案1】:

你可以使用

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

请参阅regex demo详情

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

\1 是对第 1 组值的替换反向引用。

Python test:

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>"

【讨论】:

    【解决方案2】:

    你可以使用

    (<number>\s*){2,}
    
    • (&lt;number&gt;\s*) 捕获组 1,匹配 &lt;number&gt; 后跟可选字符
    • {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"\1", s))
    

    输出

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

    【讨论】:

    • @JvdV 尾随空格现在位于第 1 组中,因此您可以保留它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多