匹配文件名开头和扩展名的正则表达式
什么是用来匹配以'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()`)。