Python脚本用于匹配文件名中的特定文本并计算此类文件的数量

时间:2014-07-31 09:05:37

标签: python

在文件夹中,我有包含文件名的文件如下:

Q1234_ABC_B02_12232.hl7

12313_SDDD_Q03_44545.hl7

Q43434_SAD_B02_2312.hl7

4324_SDSD_W05_344423423.hl7

3123123_DSD_D06_67578.hl7

和许多这样的文件

我需要编写一个python脚本来计算文件名开头的文件数" Q"哪个有" B02"在第二个下划线后,这意味着我应该将输出计数为2.我已经尝试了以下脚本但没有得到所需的解决方案。

    import re
    import os

resultsDict = {}
myString1 = ""
regex = r'[^_]+_([^_]*)_.*'
for file_name in os.listdir("."):

m = file_name.split("_")

if len(m) > 2 :
   myString = m[2]

   if "B02" in myString:
   myString1 = myString

   if myString1 in resultsDict:
       resultsDict[myString1] += 1
   else:
       resultsDict.update({myString1: 1})
else:
print "error in the string! there are less then 2 _"

print resultsDict

我正在使用python 2.6.6。任何帮助都会有用。

5 个答案:

答案 0 :(得分:1)

在写这篇文章的时候,有一个错误的正则表达式有几个答案。

其中一个可能更好:

r'^Q[^_]*_[^_]*_B02_.*'

r'^Q[^_]*_[^_]*_B02.*'

r'^Q[^_]*_[^_]*_B02(_.*|$)'

如果坚持使用.*,正则表达式可能会消耗一些中间下划线。因此,您无法再在第二次 B02

之后强制执行_

之后,测试匹配值(re.match)是对各种文件名(os.listdirglob.glob)的简单循环。以下是使用列表理解的示例:

>>> l = [file for file in os.listdir(".") if re.match(r'^Q[^_]*_[^_]*_B02.*', file)]
>>> l
['Q1234_ABC_B02_12232.hl7', 'Q43434_SAD_B02_2312.hl7']
>>> len(l)
2

为了获得更好的性能,您可能希望首先编译正则表达式(re.compile)。


正如@camh上面的评论让我想一想,你可能已经跳过Python,因为你找不到基于shell的解决方案,这里是如何使用bash做同样的事情:

sh$ shopt -s extglob
sh$ ls Q*([^_])_*([^_])_B02*
Q1234_ABC_B02_12232.hl7  Q43434_SAD_B02_2312.hl7
sh$ ls Q*([^_])_*([^_])_B02* | wc -l
#                            ^^^^^^^
# This *won't* work if some file names contain '\n' !!!

答案 1 :(得分:0)

使用正则表达式

import re
resultsDict = {}
expression = "^Q.*_.*_B02_.*"
p = re.compile(expression)
for file_name in os.listdir("."):
    if p.match(file_name):
        if file_name in resultsDict:
            resultsDict[file_name] = resultsDict[file_name] + 1
        else:
            resultsDict[file_name] = 1

答案 2 :(得分:0)

您可以尝试使用此正则表达式:

'^Q.*_.*_B02_.*'

答案 3 :(得分:0)

此代码将根据您的要求匹配当前目录中的所有文件。

import os
import re

regex = r'^Q\w+_\w+_B02'   # This will match any word character between the underscores

for f in os.listdir("."):
    if re.match(regex, f, re.I):
       print f
  • 单词字符是A-Z,a-z和0-9。

答案 4 :(得分:0)

具有列表推导而不是正则表达式的解决方案。首先,获取以Q开头的所有目录名称,并将它们拆分为下划线;

import os

dirs = [d.split('_') for d in os.listdir(".") if d.startswith('Q')]

现在获取具有两个或更多下划线的所有目录;

dirs = [d for d in dirs if len(d) > 2]

最后,缩小范围;

dirs = [d for d in dirs if d[2] == 'B02']

你可以将最后一个与理解结合成一个;

dirs = [d for d in dirs if len(d) > 2 and d[2] == 'B02']