4

介绍

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

问题

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

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

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

4

3 回答 3

2

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

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

输出:

这\是\ (?:Perl|Ruby)

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

于 2009-11-03T14:04:15.547 回答
1

首先,您正试图以艰难的方式做到这一点。我怀疑这可能不是不可能的,但你必须应用一些人工智能技术,这将比它的价值复杂得多。可以训练神经网络或遗传算法系统来识别 Z 数和 T 数,假设 和 的格式Z[0-9]+总是T[0-9]+在正则表达式的某处使用。

我要解决这个问题是编写一个 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]+[ -/.=]

于 2009-11-03T14:07:31.420 回答
0

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

于 2009-11-03T14:08:12.840 回答