25

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

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

RunFoo.py
RunBar.py
Run42.py

它不应该匹配:

myRunFoo.py
RunBar.py1
Run42.txt

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

4

8 回答 8

54

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

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

快速解释:

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

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

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

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

于 2008-10-08T23:48:59.517 回答
15

警告:

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

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

于 2008-10-09T00:01:25.030 回答
15

我真的不明白你为什么要使用正则表达式来解决这个“问题”。您只是想找到所有以“运行”开头的 .py 文件。所以这是一个简单的解决方案,它可以工作,而不需要编译一个正在运行的正则表达式:

import os
for filename in os.listdir(dirname):
    root, ext = os.path.splitext(filename)
    if root.startswith('Run') and ext == '.py':
        print filename
于 2008-10-09T01:27:29.927 回答
10
/^Run.*\.py$/

或者,特别是在 python 中:

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

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

re.match(r"^Run.*\.py$", stringtocheck, re.I)
于 2008-10-08T23:46:24.747 回答
6

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

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

import os, glob
files = glob.glob( "".join([ os.getcwd(), "\\Run*.py"]) )
于 2008-10-09T11:57:56.613 回答
4

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

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

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

于 2008-10-09T01:20:30.330 回答
0

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

/^Run[\w]*?\.py$/
于 2008-10-08T23:45:57.230 回答
0

也许:

^Run.*\.py$

只是快速尝试

于 2008-10-08T23:47:56.633 回答