2008-10-08 140 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"])) 
相关问题