2017-01-10 74 views
-3

我想找到的正則表達式,這讓下面的匹配(請注意,有一個linebreakt!)查找正則表達式刪除重複

inputString:

"a0Ew0" 
"a0Ew0" 
"a0Ew0s" 
"a0Ew0s" 

輸出:

"a0Ew0" 
"a0Ew0s" 
+1

爲什麼你想要一個正則表達式的特定原因?此外,是否總是直接相互重複,還是可以穿插? –

+1

我沒有看到正則表達式應該在這裏做什麼,我能想到的唯一的事情就是實現一個*唯一性過濾器*。 –

+0

@Willem Van OnsemThats right –

回答

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"'] 
4

您可以將列表轉換爲一組,以擺脫重複

的參閱以下內容:https://repl.it/FFOJ/0

l = set(["a0Ew000001UD2t8EAD", "a0Ew000001UD2t8EAD", "a0Ew000001UD4AFEA1", "a0Ew000001UD4AFEA1"]) 
print(l) 
+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" 
0

REGEXP:Python之

(\w+) 

如果連續,u能去除偶數或奇數元素。
即使

[0]"a0Ew0ssss" <-- Deleted 
[1]"a0Ew0ssss" 
[2]"a0Ew0" <-- Deleted 
[3]"a0Ew0" 
[4]"a0Ew0s" <-- Deleted 
[5]"a0Ew0s" 

結果:

[0]"a0Ew0ssss" 
[1]"a0Ew0" 
[2]"a0Ew0s" 
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"'] 

(注意:我如何加入第一線的另一個副本的數據集的結尾表明這兩個解決方案只考慮線路是重複的是他們之後對方出現,什麼也沒有如果你還想刪除不同行之間的重複項,我懷疑會有使用正則表達式的解決方案。)