我想找到正则表达式,进行以下匹配(注意有一个换行符!)
inputString:
"a0Ew0"
"a0Ew0"
"a0Ew0s"
"a0Ew0s"
输出:
"a0Ew0"
"a0Ew0s"
答案 0 :(得分:4)
您可以将列表转换为一组以摆脱重复
请参阅以下内容:https://repl.it/FFOJ/0
l = set(["a0Ew000001UD2t8EAD", "a0Ew000001UD2t8EAD", "a0Ew000001UD4AFEA1", "a0Ew000001UD4AFEA1"])
print(l)
答案 1 :(得分:1)
正则表达式不是正确的工具。
如果重复元素是连续的,您可以使用简单的列表理解来实现此目的:
lines=""""a0Ew000001UD2t8EAD"
"a0Ew000001UD2t8EAD"
"a0Ew000001UD4AFEA1"
"a0Ew000001UD4AFEA1"
""".splitlines()
filtered = [l for i,l in enumerate(lines) if i==0 or lines[i-1]!=l ]
只有当它是第一个时才会创建元素(因此,索引== 0测试或前一个元素与当前元素不同)。
结果:
['"a0Ew000001UD2t8EAD"', '"a0Ew000001UD4AFEA1"']
答案 2 :(得分:1)
当你能做到这一点时,你不需要正则表达式:
from collections import OrderedDict
inputString = """"a0Ew0"
"a0Ew0"
"a0Ew0s"
"a0Ew0s"
"""
ls = inputString.split("\n") #splits the string to a list
print(*(list(OrderedDict.fromkeys(ls))))
输出:
"a0Ew0" "a0Ew0s"
答案 3 :(得分:0)
REGEXP:Python
(\w+)
如果连续,你可以删除偶数或奇数元素。
均匀强>
[0]"a0Ew0ssss" <-- Deleted
[1]"a0Ew0ssss"
[2]"a0Ew0" <-- Deleted
[3]"a0Ew0"
[4]"a0Ew0s" <-- Deleted
[5]"a0Ew0s"
<强>结果:强>
[0]"a0Ew0ssss"
[1]"a0Ew0"
[2]"a0Ew0s"
答案 4 :(得分:0)
如果你真的,真的想要使用正则表达式,你可以使用negative lookahead (?!...)
检查当前组(".+")
是否后跟换行符\n
及其自身\1
。
>>> inpt = """"a0Ew000001UD2t8EAD"
"a0Ew000001UD2t8EAD"
"a0Ew000001UD2t8EAD"
"a0Ew000001UD4AFEA1"
"a0Ew000001UD4AFEA1"
"a0Ew000001UD2t8EAD"
"""
>>> re.findall(r'(".+")(?!\n\1)', inpt)
['"a0Ew000001UD2t8EAD"', '"a0Ew000001UD4AFEA1"', '"a0Ew000001UD2t8EAD"']
但相反,我宁愿建议使用例如itertools.groupby
:
>>> [key for key, group in itertools.groupby(inpt.splitlines())]
['"a0Ew000001UD2t8EAD"', '"a0Ew000001UD4AFEA1"', '"a0Ew000001UD2t8EAD"']
(注意我是如何将第一行的另一个副本添加到数据集的末尾,以表明这两个解决方案只考虑重复的行是它们彼此相继出现,两者之间没有任何内容。如果你也是想要删除中间不同行的重复项,我怀疑是否会有使用正则表达式的解决方案。)