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

31 投票
8 回答
115868 浏览
提问于 2025-04-11 09:35

什么是用来匹配以'Run'开头并且文件名后缀是'.py'的字符串(在这个例子中是文件名)的正则表达式?

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

RunFoo.py
RunBar.py
Run42.py

但是,它不应该匹配:

myRunFoo.py
RunBar.py1
Run42.txt

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

8 个回答

15

警告:

  • jobscry的回答("^Run.?.py$")是错误的(比如,它不会匹配"Run123.py")。
  • orlandu63的回答("/^Run[\w]*?.py$/") 也不会匹配"RunFoo.Bar.py"。

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

18

我不太明白你为什么要用正则表达式来解决这个“问题”。你其实只是想找到所有以'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
61

对于正则表达式,你可以使用:

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

简单解释一下:

  • `.` 代表可以匹配任何字符。
  • `*` 代表可以匹配前一个字符的任意重复(所以 `.*` 就是可以匹配任何字符的序列)。
  • `\` 是用来转义的,可以让你把点号当成普通字符来处理。
  • `$` 表示“字符串的结尾”,这样我们就不会匹配到像“Run_foo.py.txt”这样的字符串。

不过,对于这个任务来说,使用简单的字符串方法可能更好。比如:

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

注意:如果你想不区分大小写(比如同时匹配“run.PY”和“Run.py”),可以在正则表达式中使用 `re.I` 选项,或者在使用字符串方法之前把文件名转换成特定的大小写(例如 `filename.lower()`)。

撰写回答