簡體   English   中英

如何編寫不包含某些文件后綴的正則表達式?

[英]How do I write a regex that excludes certain file suffixes?

我正在看這里給出的教程:

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 ),但是我很好奇如何僅使用正則表達式來完成此工作。

好吧,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!

當您堅持使用正則表達式執行此操作時:

這是您當前的正則表達式表示形式

正則表達式可視化

這是從@rawing建議中得到啟發的解決方案:

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

正則表達式可視化

使用Python的re模塊要注意的一件事是re.match隱式地錨定到字符串的開頭。

另外,您可以通過轉義字串( \\. )來匹配字面量,這可能比將其放入字符類中更容易閱讀(並且可能更快)。

對於re.match ,以下正則表達式可以解決問題:

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

如果改用re.search ,則可以將正則表達式縮短為:

r'\.pqr\.gz$'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM