在一个文件夹中,我有包含以下文件名的文件:
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。任何帮助都会有用。
最佳答案
截至撰写本文时,有几个答案的正则表达式错误。
其中一个可能更好:
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' !!!
关于Python 脚本匹配文件名中的特定文本并计算此类文件的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25054899/