2008-10-08 54 views
16

什麼是正則表達式匹配字符串(在這種情況下,文件名)與「運行」開始,有「的.py」的文件擴展名?正則表達式匹配文件名和擴展名的開始

正則表達式應匹配以下任一:

RunFoo.py 
RunBar.py 
Run42.py 

它不應該匹配:

myRunFoo.py 
RunBar.py1 
Run42.txt 

的SQL相當於我所尋找的是... LIKE 'Run%.py' ...

回答

32

對於一個正則表達式,你可以使用:

re.match(r'Run.*\.py$') 

一簡單說明:

  • 。意味着匹配任何角色。
  • *表示匹配前一個字符的任何重複的(因此。*表示字符的任意序列)
  • \是逃避明確點
  • 逃生$表示「字符串的結束」,所以我們不」 t匹配「Run_foo.py.txt」

但是,對於此任務,您最好使用簡單的字符串方法。即。

filename.startswith("Run") and filename.endswith(".py") 

注意:如果你想不區分大小寫(即符合「run.PY」以及「Run.py」,使用如re.I選項正則表達式,或轉換到一個特定的情況下(。如filename.lower())使用字符串方法之前

0

這可能並不完全符合文件命名標準,但這裏有雲:

/^Run[\w]*?\.py$/ 
+0

看起來像標籤蟒蛇一個問題一個Perl的解決方案......但我不是一個Python專家:P工作分析指出你的解決方案是區分大小寫的。 – 2008-10-08 23:57:35

+0

*錯誤有Rob Howard指出是 – 2008-10-08 23:58:20

+0

不應該使用。*,而不是\ w - 標點符號和空格等可能仍應被視爲文件名的一部分。例如「Run.foo.py」 – Brian 2008-10-08 23:58:30

6
/^Run.*\.py$/ 

或者,在蟒蛇具體爲:

import re 
re.match(r"^Run.*\.py$", stringtocheck) 

這將匹配「Runfoobar .py「,但不是」runfoobar.PY「。爲了使它不區分大小寫,而使用:

re.match(r"^Run.*\.py$", stringtocheck, re.I) 
0

mabye:

^Run.*\.py$ 

只是一個快速的嘗試

+0

您需要。*,而不是。? (它只會匹配單個字符) – Brian 2008-10-08 23:54:28

14

警告:

  • jobscry的回答( 「?^運行PY $」)是不正確的(不能匹配 「Run123.py」,爲例子)。
  • orlandu63的回答( 「/^Run[\w]*?.py$/」)不匹配 「RunFoo.Bar.py」。

(我沒有足夠的信譽發表評論,對不起。)

2

如果你寫一個稍微複雜的正則表達式,你可以得到一個額外的功能:提取「運行」之間的位和「py」爲:

>>> import re 
>>> regex = '^Run(?P<name>.*)\.py$' 
>>> m = re.match(regex, 'RunFoo.py') 
>>> m.group('name') 
'Foo' 

(額外位是括號他們之間的一切,除了'。*',就像羅布霍華德的回答一樣)

12

我真的不明白你爲什麼要用正則表達式來解決這個問題。你只是想找到所有以'Run'開頭的.py文件。所以這是一個簡單的解決方案,將工作,而不訴諸編譯一個運行的正則表達式:

import os 
for filename in os.listdir(dirname): 
    root, ext = os.path.splitext(filename) 
    if root.startswith('Run') and ext == '.py': 
     print filename 
4

你並不需要一個正則表達式,你可以使用水珠,這需要通配符例如運行*的.py

例如,要獲取這些文件在當前目錄...

import os, glob 
files = glob.glob("".join([ os.getcwd(), "\\Run*.py"])) 
相關問題