2016-09-22 133 views
0

**问题**我正在尝试逐行搜索已添加到数组文件名的文件,并使用通配符(如*)打印包含filename.mxf的任何字符串。 .MXF。文件中的行将是\ E:\ AVMedia \ filename.mxf。我想在变量(匹配)中列出filename.mxf。搜索可变数组中的通配符和字符串

## opens files in array ## 

    print name #debug# 
    file = open(os.path.join(path,filename), 'r') 
    #print file.read() 

## search for all strings containing .mxf from array ## 

## create regular expression ## 

pattern = "(*.mxf)" 

matching = [s for s in rasp if re.match(pattern, '\')] 
print matching 
+0

你说的're.match('是什么意思? ”,图案)'? 'pattern'应该是第一个参数,'?''是一个无效的正则表达式模式。如果您提供[MCVE(最小完整可验证示例)](http://stackoverflow.com/help/mcve),将会非常有帮助。 –

+0

谢谢你,我已经编辑了这个例子来认识MCVE。我认为这对数组是如何创建可能很重要。我不确定如何使用re.match在每行中搜索* .mxf并仅显示filename.mxf,而不是\ E:\ AVMedia \ filename.mxf – user6705306

+0

尝试['pattern = r“[^ \ s \\ ] + \。mxf \ b“'与're.findall'](https://ideone.com/Vu1X9u)。 –

回答

0

一对夫妇与您尝试不同的问题:

  1. 通配符(或glob)模式是不一样的正则表达式。

    在正则表达式中,*与表达式中前一项的0或更多匹配。如果*出现在表达式(或子表达式,如加括号的子表达式或用于分隔多个子表达式的替换运算符|)的表达式的开始处(或子表达式),则它不具有特殊含义并且只与*字符匹配。因此

    pattern = "(*.mxf)" 
    

    是具有文字串匹配*.mxf一个括号子表达式正则表达式。您可以使用.*而不是*来匹配任意数量的非换行符字符,或[^/]*以匹配任意数量的非路径分隔符字符。

  2. re.match(pattern, '\')是非法的(\转义以下',所以你最终以未终止的字符串)。

  3. 即使您将其修复为re.match(patterh, '\\'),也会将您的模式与固定字符串\每次匹配。我假设你真正想要的是

    matching = [s for s in rasp if re.match(pattern, s)] 
    

    为了在rasppattern匹配的正则表达式返回每个项目的列表。

你最好的解决办法可能是让你的模式的真正的文件名glob模式(pattern = "*.mxf"),并使用Python的fnmatch模式检验代替:

import fnmatch 
import os.path 
pattern = "*.mxf" 
matching = [os.path.basename(s) for s in rasp if fnmatch.fnmatch(s, pattern)] 
print matching 
+0

谢谢你,J伯爵。特别是对于解释,非常大的帮助。我将这个标记为正确的,但是我不确定如何在我的当前数组中使用它,在'print matching'上我只输出'[]'。你可以看看我是如何制作阵列的吗?我的理解仍然非常有限。 – user6705306

+0

更新此问题,请使用您当前的代码 –

+0

更好,然后用更新后的代码问一个新问题,因为这是一个新问题:) –