2017-01-19 17 views
0

我期待在這裏給出的教程: -如何編寫排除某些文件後綴的正則表達式?

https://docs.python.org/2/howto/regex.html#lookahead-assertions

我想排除在.pqr.gz結尾的文件,我不太清楚該怎麼做。

如預期的行爲是: -

f1.gz => succeed 
f1.abc.pqr => succeed 
f1.pqr.gz => fail 
f1.abc.gz => succeed 

我能想出的最好的正則表達式是: -

r'.*[.](?=[^.]*[.][^.]*)(?!pqr[.]gz$)[^.]*[.][^.]*$' 

這不包括在.pqr.gz但沒有按結尾的文件」例如,允許只有f1.gz的文件(即上面我寫的第一種情況)。

有關如何改進這一點的任何想法?

編輯: - 有更好的方法來做到這一點(例如,使用string.endswith),但我很好奇怎麼純粹做一個正則表達式作爲一個練習。

+4

你不應該使用正則表達式來檢查後綴。 –

+2

'。*(?<!\。pqr \ .gz)$' –

+0

@Rawing有效。你可以把它寫成答案(希望有解釋),我會接受它。 – owagh

回答

0

好吧,TBH,你對正則表達式的使用對我來說似乎有點矯枉過正。你可以簡單地做:

if not '.pqr.gz' in line: 
    print(line) 

並完成。

其實,「簡單」的字符串操作可以在短短几個簡單的操作做了很多,比如:

for line in lines: 
    file, result = line.split(' => ') 
    if file.endswith('.pqr.gz'): 
     print("Skipping file {}".format(file), file=sys.stderr) 
     continue 
    print(file) 
    # and you could do something if result == "success" there after! 

,你堅持用正則表達式做:

這裏是你的當前正則表達式表示

Regular expression visualization

而這裏的從@rawing建議啓發瞭解決方案:

.*(?<!\.pqr\.gz) => 

Regular expression visualization

+1

至少使用'str.endswith' .. – L3viathan

+0

我想我應該提一下,它更多的是使用正則表達式的心理練習,而不是任何實際的目的。 – owagh

+0

但你想過濾出不是gz或pqr的擴展嗎? –

-1

有一點要注意的與Python的re模塊是re.match隱式錨定字符串的開始。

此外,您可以通過轉義文字句段來匹配文字句號(\.),這可能比將其放在字符類中更容易閱讀(並且可能更快)。

對於re.match以下的正則表達式應該做的伎倆:如果使用re.search代替

r'.*\.pqr\.gz$' 

,正則表達式可以縮短到僅僅這一點:

r'\.pqr\.gz$' 
+0

re.match需要注意的另一件事是你必須提供自己的錨到字符串的END。有兩種選擇,'\ Z'和'$'...''''作爲perl的宿醉。使用'\ Z' –

+0

同樣,只有在明確希望匹配語句考慮尾隨換行符時,'\ Z'纔是可取的。 '$'不僅僅是perl的宿醉,它是一個不同的錨也是有用的。例如,如果您試圖匹配行尾而不是字符串末尾,特別是在使用'flags = re.MULTILINE'時,'\ Z'是錯誤的選擇。 – KingRadical

+0

再次看看OP的問題......希望字符串以「foo」結尾,而不是「foo \ n」 –