在文件夹中,我有包含文件名的文件如下:
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。任何帮助都会有用。
答案 0 :(得分:1)
在写这篇文章的时候,有一个错误的正则表达式有几个答案。
其中一个可能更好:
r'^Q[^_]*_[^_]*_B02_.*'
r'^Q[^_]*_[^_]*_B02.*'
r'^Q[^_]*_[^_]*_B02(_.*|$)'
如果坚持使用.*
,正则表达式可能会消耗一些中间下划线。因此,您无法再在第二次 B02
_
之后,测试匹配值(re.match
)是对各种文件名(os.listdir
或glob.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
答案 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']