2010-10-11 52 views
0

什麼是正確的正則表達式語句,使用re.search()來查找和返回字符串中的文件擴展名。python正則表達式問題

如: (.+).(avi|rar|zip|txt)

我需要它來搜索一個字符串,如果它包含任何的AVI,RAR等)的回報只是擴展。

謝謝!

編輯:補充一點,是需要區分大小寫

+0

你真的要搜索一個字符串的像'.avi'第一次出現或者你想檢查一個字符串重圓?問另一種方式,是字符串一般文本「弗雷德送我富。rar today「還是應該包含文件名或路徑的擴展名? – 2010-10-11 19:49:06

回答

1

短交互式運行:

>>> import re 
>>> pat="(.+)\.(avi|rar|zip|txt)" 
>>> re.search(pat, "abcdefg.zip", re.IGNORECASE).groups() 
('abcdefg', 'zip') 
>>> re.search(pat, "abcdefg.ZIP", re.IGNORECASE).groups() 
('abcdefg', 'ZIP') 
>>> 
+0

在這種特殊情況下,這不是問題,但建議將正則表達式文字作爲原始字符串,以避免雙重轉義。使用'r「(。+)\。(avi | rar | zip | txt)」' – SingleNegationElimination 2010-10-11 23:30:43

6

您需要:

(.)\.(avi|rar|zip|txt)$ 

注意反斜槓逃脫點。這將使它尋找一個字面點而不是任何字符。

爲使其不區分大小寫,請在您的search調用中使用RE.I標誌。

re.search(r'(.)\.(avi|rar|zip|txt)$', string, re.I) 
+2

那麼是否還有一個標誌使得Python解釋器不區分大小寫?否則,我們必須'將re導入爲RE'才能夠找到'RE.I' ... – 2010-10-11 18:41:16

+1

你可以通過將其更改爲'。\。(avi | rar | zip | txt)$'來隱約找到更有效率,更隱蔽的內容。''這將確保在點之前有一些字符,並且文件擴展名位於字符串的末尾,這樣,最終的第一個匹配就是擴展名而不是第二個匹配項,並且最終不會保留匹配項你不需要 – intuited 2010-10-11 18:48:44

+0

@Nick T:re.I標誌僅用於正則表達式模塊,我不知道如何讓其餘的python區分大小寫。 – JoshD 2010-10-11 19:04:31

0

因爲我覺得正則表達式是邪惡的......

def return_extension(filename): 
    '''(This functions assumes that filenames such as `.foo` have extension 
    `foo`.) 
    ''' 
    tokens = filename.split('.') 

    return '' if len(tokens) == 1 else tokens[-1] 

...我主張簡單地分析文件名。

+0

重新發明輪子但不重新發明軸更加邪惡。 – 2010-10-11 19:57:32

0

如果您知道分機號是在字符串的結尾處,這應該很好地工作:

.\.(avi|rar|zip|txt)$ 
  • 的第一位將確保有點之前的一些特徵。

  • $指定文件擴展名位於字符串的末尾,即$表示「字符串在此結束」。有關這方面的血腥詳細信息,包括您應該注意的帶有換行符的邊緣案例,請參閱JoshD's answer的註釋討論以及docs$的條目。

所以後來在match.groups()元組的唯一入口,即match.groups()[0],將擴展本身。

+0

@intuited:-1。 s /一些邊緣案例/ FAIL/ – 2010-10-12 01:28:05

+0

@John Machin:廢話,真的嗎?我想不出任何。什麼是一個例子? – intuited 2010-10-12 01:41:29

+0

@intuited:「」「blah \ Z在默認非多行模式下的理由是re.match(」blah $「,」blah \ n「)不會返回None」「」 – 2010-10-12 02:22:47

8

的標準庫是更好;)

>>> os.path.splitext('hello.py') 
('hello', '.py') 
+0

+1這是工作的正確工具! – katrielalex 2010-10-11 19:33:13