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

标签 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。任何帮助都会有用。

最佳答案

截至撰写本文时,有几个答案的正则表达式错误。

其中一个可能更好:

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' !!!

关于Python 脚本匹配文件名中的特定文本并计算此类文件的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25054899/

相关文章:

Python 'timestamp' 无法转换为MySQL类型

python - 使用 numpy 将矩阵元素替换为其他矩阵元素

python - 如何使用 python 将 Hdf5 文件部分复制到保持相同结构的新文件中?

python - 什么符号 |在 Python 中是什么意思?

python - 如何避免由 Python 的早期绑定(bind)默认参数(例如可变默认参数 "remembering"旧数据)引起的问题?

python - 如何将参数传递给 Python 函数?

python - 使用 BeautifulSoup 获取完整的 URL 而不仅仅是路径

Python (3.3) 无效语法错误

python - 解决彩色方 block 匹配难题的脚本建议

Python 元类与对象实例化一起使用