正则表达式查找重复词

时间:2021-04-23 05:49:24

标签: python regex duplicates

我有一个单词列表,其中有些是相同的。我需要找到这些重复项以用空字符串替换它们。我对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

你可以看到没有AC。当它出现在 ACMR 之前时,他总是匹配独立 AC 并替换它。但这些是不同的词,我的结果中的每个词都需要一个。

有人可以帮我吗? 提前致谢

4 个答案:

答案 0 :(得分:1)

如果您想保留顺序,一种选择可能是使用 split 和 join 并从值中删除空格。

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+)*< /p>

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

答案 1 :(得分:0)

<块引用>

这比我想象的要复杂得多,你应该尝试一个非正则表达式的解决方案

试试这个正则表达式:

(?:(?<=;)|(?<=^))([^;]+)(?=.*;\1(?=;|$));
  • (?:...) 非捕获组
  • (?<=;)|(?<=^) 向后看,确保以下单词后跟 ; 或字符串的开头
  • ([^;]+) 任何不是由 ; 制作的东西,并将其归入第 1 组
  • (?=.*;\1(?=;|$)) 前瞻,前面有第 1 组的副本,后面是 ;; 或后面的字符串结尾
  • ; 匹配单词后的 ;

检查 results


使用python:

import re

text = 'AC;AC MR;TA;AC MR;AC;AC MR;TA;SDA'
result = re.sub(r'(?:(?<=;)|(?<=^))([^;]+)(?=.*;\1(?=;|$));', '', text)
print(result) # AC;AC MR;TA;SDA

答案 2 :(得分:0)

正则表达式似乎不是在这里使用的正确工具。

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

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

虽然这仍然涉及多个步骤,但它可能比复杂的正则表达式更容易理解。请注意,可能不会保留单词的顺序。

答案 3 :(得分:0)

如果不使用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'}
相关问题