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

时间:2009-11-03 13:49:55

标签: regex algorithm pattern-matching filenames

简介

我在有显微镜的设施工作。可以要求这些家伙制作一部分样本的4D电影:在不同的Z位置拍摄10张照片,然后等待一定的时间(下一个时间点)并再次拍摄10张照片。 可以要求他们为每个切片保存文件,并使用明确的命名模式,如2009-11-03-experiment1-Z07-T42.tif。文件名编号以反映Z位置和时间点

问题

获得所有这些文件名后,如果您知道文件名的主干模式,则可以使用regex模式提取Z和T值。我知道怎么做。

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

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

3 个答案:

答案 0 :(得分:2)

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

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

输出:

 this\ is\ (?:Perl|Ruby)

也许你可以将成对的文件名添加到这种东西中以获得初始正则表达式。但是,这不会让你捕获数字等,所以它不会是完全自动的。获得差异之后,您将不得不手工编辑或进行某种替换以获得正常的正则表达式。

答案 1 :(得分: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.

如果幸运的话,根本就没有多个匹配项,您可以使用上面的正则表达式来提取您的数字。但是,如果存在任意数量的多个匹配项,则可以使用某些print语句再次运行该脚本,以显示引发多重匹配的示例文件名。这将告诉您是否可以对正则表达式进行简单调整。

例如,如果您在T号码上有23,768个多个匹配项,那么让脚本每隔500个文件名打印多个匹配项,这样就可以检查47个样本。

类似[ -/.=]T[0-9]+[ -/.=]之类的东西可能足以让多个匹配变为零,同时还为每个文件名提供一次性匹配。或者最糟糕的是,[0-9][ -/.=]T[0-9]+[ -/.=]

答案 2 :(得分:0)

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