用于匹配文件名开头和文件扩展名的正则表达式

27

正则表达式是什么,可以用来匹配以“Run”开头并且文件扩展名为“.py”的字符串(在这种情况下是文件名)?

该正则表达式应该匹配以下任何一种情况:

RunFoo.py
RunBar.py
Run42.py

它不应该匹配:

myRunFoo.py
RunBar.py1
Run42.txt

我要查找的SQL等价语句是 ... LIKE 'Run%.py' ...

8个回答

59

正则表达式使用:

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

快速解释:

  • . 表示匹配任何字符。
  • * 表示匹配前一个字符的任意重复(因此 .* 表示任意字符序列)
  • \ 是转义符,用于转义显式的点
  • $ 表示“字符串末尾”,因此我们不会匹配“Run_foo.py.txt”

但是,对于此任务,您可能最好使用简单的字符串方法。即。

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

注意:如果你想实现大小写不敏感(例如匹配 "run.PY" 和 "Run.py"),使用正则表达式的 re.I 选项,或在使用字符串方法之前将其转换为特定大小写(例如 filename.lower())。


3
  1. Python 正则表达式匹配不需要指定行的开头。
    • 表示零个或多个匹配(例如,Run.py 是可以被接受的)。
- Zing-
另外,你如何使其不区分大小写? - Zing-
re.match已经指定了字符串的开头(与不指定开头的re.search相对)。根据定义,“Run.py”应该匹配(它以Run开头,并具有.py扩展名)。如需不区分大小写,请参见末尾的注释。 - Brian

17

我不是很明白为什么你需要正则表达式来解决这个“问题”。你只需要找到以“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

15

警告:

  • jobscry的答案(“^Run.?.py$”)是不正确的(例如不会匹配“Run123.py”)。
  • orlandu63的答案(“/^Run[\w]*?.py$/”)不能匹配“RunFoo.Bar.py”。

(我没有足够的声望来评论,抱歉。)


10
/^Run.*\.py$/

或者,特别是在Python中:

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

这个正则表达式将匹配 "Runfoobar.py",但不会匹配 "runfoobar.PY"。为了不区分大小写,可以使用以下表达式:

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

你的完整示例对我很有帮助。 - Timo

7

您不需要正则表达式,可以使用glob,它可以接受通配符,例如Run*.py

例如,要获取当前目录中的这些文件...

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

4
如果您编写稍微复杂一些的正则表达式,就可以获得一个额外的功能:提取 "Run" 和 ".py" 之间的部分。
>>> import re
>>> regex = '^Run(?P<name>.*)\.py$'
>>> m = re.match(regex, 'RunFoo.py')
>>> m.group('name')
'Foo'

(额外的部分是括号和它们之间的所有内容,除了“.*”以外,这与Rob Howard的答案相同)


0

这可能不完全符合文件命名标准,但是就这样吧:

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

看起来像是一个用 Perl 解决的被标记为 Python 的问题...但我不是 Python 专家 :p 正如 jobscry 指出的那样,你的解决方案是区分大小写的。 - Zing-
你应该使用.*而不是\w——标点符号和空格等可能仍然被视为文件名的一部分。例如,“Run.foo.py”。 - Brian

0

也许:

^Run.*\.py$

只是一个快速尝试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接