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

Posted

技术标签:

【中文标题】匹配文件名开头和文件扩展名的正则表达式【英文标题】:Regular expression to match start of filename and filename extension 【发布时间】:2008-10-08 23:42:27 【问题描述】:

匹配以“Run”开头且文件扩展名为“.py”的字符串(在本例中为文件名)的正则表达式是什么?

正则表达式应匹配以下任何一项:

RunFoo.py
RunBar.py
Run42.py

不应该匹配:

myRunFoo.py
RunBar.py1
Run42.txt

我正在寻找的 SQL 等价物是 ... LIKE 'Run%.py' ...

【问题讨论】:

【参考方案1】:

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

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

快速解释:

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

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

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

注意:如果您想要不区分大小写(即匹配“run.PY”和“Run.py”,请使用正则表达式的 re.I 选项,或转换为特定大小写(例如 filename.lower ()) 在使用字符串方法之前。

【讨论】:

1.您不必为 python 正则表达式匹配指定行首? 2. * 是零个或多个匹配(即 Run.py 是可以接受的) 另外,如何使它不区分大小写? re.match 已经指定了字符串的开头(而不是 re.search,它没有)。给定定义,“Run.py”应该匹配(它以 Run 开头,扩展名为 .py)。对于不区分大小写,请参阅末尾的注释。【参考方案2】:

警告:

jobscry 的答案 ("^Run.?.py$") 不正确(例如,与 "Run123.py" 不匹配)。 orlandu63 的答案 ("/^Run[\w]*?.py$/") 与 "RunFoo.Bar.py" 不匹配。

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

【讨论】:

【参考方案3】:

我真的不明白你为什么要使用正则表达式来解决这个“问题”。您只是想找到所有以“运行”开头的 .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】:
/^Run.*\.py$/

或者,特别是在python中:

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

这将匹配“Runfoobar.py”,但不匹配“runfoobar.PY”。要使其不区分大小写,请改用:

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

【讨论】:

您的完整示例帮助了我。【参考方案5】:

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

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

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

【讨论】:

【参考方案6】:

如果你写一个稍微复杂一点的正则表达式,你可以获得一个额外的功能:提取“Run”和“.py”之间的位:

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

(额外的一点是括号和它们之间的所有内容,除了 '.*' 这是 Rob Howard 的回答)

【讨论】:

【参考方案7】:

这可能不完全符合文件命名标准,但在这里:

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

【讨论】:

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

也许:

^Run.*\.py$

快速尝试

【讨论】:

以上是关于匹配文件名开头和文件扩展名的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

匹配字符串的正则表达式不结束或不包含文件扩展名

正则表达式,文件名通配,扩展正则之间的一些异同

正则表达式匹配路径

正则表达式和扩展表达式

Linux正则表达式教程:Grep Regex示例

Linux学习-正则表达式与文本搜索