自动查找文件名中的编号模式

问题描述 投票:0回答:3

简介

我在一家有显微镜的工厂工作。可以要求这些人生成样本的 4D 电影:例如,他们拍摄在不同的Z位置拍摄10张照片,然后等待一定时间(下一个时间点)并再次拍摄10张切片。 可以要求他们为每个切片保存一个文件,并且他们使用明确的命名模式,例如

2009-11-03-experiment1-Z07-T42.tif
。文件名进行编号以反映 Z 位置和时间点

问题

获得所有这些文件名后,如果您知道文件名的主干模式,则可以使用

regex
模式来提取 Z 和 T 值。这我知道该怎么做。

我的问题是:你知道一种从文件名列表自动生成正则表达式模式的方法吗?例如,网上有一个很棒的工具可以做类似的事情:txt2re

您将使用什么算法来解析所有文件名列表并生成最可能的正则表达式模式?

regex algorithm filenames
3个回答
2
投票

有一个名为 String::Diff 的 Perl 模块,它能够为两个不同的字符串生成正则表达式。它给出的例子是

my $diff = String::Diff::diff_regexp('this is Perl', 'this is Ruby');
print "$diff\n";

输出:

 这\是\ (?:Perl|Ruby)

也许你可以将文件名对输入到这种东西中以获得初始正则表达式。但是,这不会让您捕获数字等,因此它不会完全自动。获得差异后,您必须手动编辑或进行某种替换才能获得有效的最终正则表达式。


1
投票

首先,你正试图以艰难的方式做到这一点。我怀疑这可能不是不可能的,但你必须应用一些人工智能技术,而且它会比它的价值复杂得多。假设正则表达式中始终使用

Z[0-9]+
T[0-9]+
的格式,则可以训练神经网络或遗传算法系统来识别 Z 数和 T 数。

解决这个问题我要做的是编写一个Python脚本来处理所有文件名。在此脚本中,我将与文件名匹配两次,一次查找

Z[0-9]+
,一次查找
T[0-9]+
。每次我都会计算 Z 号码和 T 号码的匹配情况。

我会保留另外四个带有运行总计的计数器,两个用于 Z 数字,两个用于 T 数字。每对代表有 1 个匹配的文件名的数量,以及有多个匹配的文件名的数量。我会计算处理的文件名总数。

最后我汇报如下:

nnnnnnnnnn filenames processed

Z-numbers matched only once in nnnnnnnnnn filenames.
Z-numbers matched multiple times in nnnnnn filenames.

T-numbers matched only once in nnnnnnnnnn filenames.
T-numbers matched multiple times in nnnnnn filenames.

如果幸运的话,根本不会有多个匹配,您可以使用上面的正则表达式来提取您的数字。但是,如果存在大量的多重匹配,您可以使用一些打印语句再次运行脚本,以显示引发多重匹配的示例文件名。这会告诉您对正则表达式的简单调整是否可行。

例如,如果您在 T 号码上有 23,768 个多个匹配项,则让脚本打印每 500 个具有多个匹配项的文件名,这将为您提供 47 个样本进行检查。

可能像

[ -/.=]T[0-9]+[ -/.=]
这样的东西足以将多个匹配项减少到零,同时还为每个文件名提供一次性匹配。或者最坏的情况是,
[0-9][ -/.=]T[0-9]+[ -/.=]


0
投票

对于 Python,请参阅this 有关 TemplateMaker 的问题。

© www.soinside.com 2019 - 2024. All rights reserved.