正则表达式查找重复单词

2024-09-30 08:22:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个单词列表,其中一些单词是相同的。我需要找到这些副本,用空字符串替换它们。我对python内部的替换没有任何问题,但是对于我尝试使用的正则表达式。 这是我的列表的一个示例:

AC;AC MR;TA;AC MR;AC;AC MR;TA;SDA

这些词用分号隔开

我使用的表达是:

\b(\w+\s*\w+)\b;(?=.*\1)

我试过了,但字里行间没有空格:

AC;ACMR;TA;ACMR;AC;ACMR;TA;SDA

我在这里得到的结果是,当我将匹配项替换为空时:

ACMR;TA;SDA

我最终想要的结果是:

AC;ACMR;TA;SDA

您可以看到,没有空调。他总是匹配独立空调,并在其出现在ACMR之前进行更换。但是这些是不同的词,我需要在我的结果中的每个词中选择一个

有人能帮我吗? 提前谢谢


Tags: 字符串示例列表副本单词acmr空格
3条回答

正则表达式似乎不是这里使用的合适工具

或者,您可以通过分隔符拆分字符串,获取唯一值并将它们重新连接在一起:

s = 'AC;AC MR;TA;AC MR;AC;AC MR;TA;SDA'
print(';'.join(set(s.split(';')))) # 'AC;TA;AC MR;SDA'

尽管这仍然涉及多个步骤,但它可能比复杂的reg-ex更容易遵循。请注意,可能不会保留单词的顺序

如果要保留顺序,一个选项可能是使用拆分和联接,并从值中删除空格

s = "AC;AC MR;TA;AC MR;AC;AC MR;TA;SDA"
print(";".join([x.replace(' ', '') for x in dict.fromkeys(s.split(";"))]))

输出

AC;ACMR;TA;SDA

Python demo

如果要查找由空格分隔的单词,可以使用re.findall和模式匹配1+单词字符(可选地由1+空格字符和1+单词字符重复)w+(?:\s+\w+)*

import re
s = "AC;AC MR;TA;AC MR;AC;AC MR;TA#$@#$;SDA"
print(";".join([x.replace(' ', '') for x in dict.fromkeys(re.findall(r"\w+(?:\s+\w+)*", s))]))

输出

AC;ACMR;TA;SDA

Python demo

如果不使用RegEx,则有一个解决方案:

data = "AC;ACMR;TA;ACMR;AC;ACMR;TA;SDA"
dataList = data.split(";");

seen = set()
duplicated = set()
for value in dataList:  
    if value not in seen:  
        seen.add(value)
    else:
        duplicated.add(value)

print(duplicated)

结果:

{'TA', 'ACMR', 'AC'}

相关问题 更多 >

    热门问题