通过正则表达式连续匹配重复的单词
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中。
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
我想找到替换字符串中重复的单词,但前提是它们彼此相邻或由 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中。
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