8

我有一个文件列表,我只想保留以“test_”开头并以“.py”结尾的文件。我希望正则表达式只返回“test_”和“.py”中的文本。我不希望包含 .pyc 文件。

我努力了:

>>>filename = 'test_foo.py'
>>>re.search(r'(?<=test_).+(?=\.py)', filename).group()
foo.py

但它仍然返回扩展名,并允许“.pyc”扩展名(我不想要)。我很确定是 '+' 消耗了整个字符串。

这可以作为后备,但我更喜欢正则表达式解决方案:

>>>filename = 'test_foo.py'
>>>result = filename.startswith('test_') and filename.endswith('.py')
>>>result = result.replace('test_', '').replace('.py', '')
>>>print result
foo
4

2 回答 2

9

问题是您的模式匹配任何出现在 bytest_和 before之后的字符串.py,但这并不限制它在 . 之前test_或之后有其他字符.py

您需要使用 start( ^) 和 end( $)锚点。另外,不要忘记转义.角色。试试这个模式:

(?<=^test_).+(?=\.py$)
于 2013-08-08T14:46:43.377 回答
2

看这个:

import re

files = [
"test_1.py",
"Test.py",
"test.pyc",
"test.py",
"script.py"]

print [x for x in files if re.search("^test_.*py$", x)]

输出:

['test_1.py']
于 2013-08-08T14:53:22.683 回答