我有一个单词列表,其中有些是相同的。我需要找到这些重复项以用空字符串替换它们。我对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 并替换它。但这些是不同的词,我的结果中的每个词都需要一个。
有人可以帮我吗? 提前致谢
答案 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
如果您想查找由空格分隔的单词,您可以使用带有模式的 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
答案 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'}