Regex 自动查找文件名中的编号模式
介绍 我在一家有显微镜的工厂工作。可以要求这些人生成一个样本的4D电影:他们在不同的Z位置拍摄10张照片,然后等待一定时间(下一个时间点),然后再次拍摄10张。 可以要求他们为每个切片保存一个文件,并使用显式命名模式,如Regex 自动查找文件名中的编号模式,regex,algorithm,pattern-matching,filenames,Regex,Algorithm,Pattern Matching,Filenames,介绍 我在一家有显微镜的工厂工作。可以要求这些人生成一个样本的4D电影:他们在不同的Z位置拍摄10张照片,然后等待一定时间(下一个时间点),然后再次拍摄10张。 可以要求他们为每个切片保存一个文件,并使用显式命名模式,如2009-11-03-experiment1-Z07-T42.tif。文件名编号以反映Z位置和时间点 问题: 拥有所有这些文件名后,如果知道文件名的主干模式,可以使用regex模式提取Z和T值。这我知道怎么做 我的问题是:您知道一种从文件名列表自动生成正则表达式模式的方法吗?例如
2009-11-03-experiment1-Z07-T42.tif
。文件名编号以反映Z位置和时间点
问题:
拥有所有这些文件名后,如果知道文件名的主干模式,可以使用regex
模式提取Z和T值。这我知道怎么做
我的问题是:您知道一种从文件名列表自动生成正则表达式模式的方法吗?例如,网上有一个很棒的工具可以做类似的事情:
您将使用什么算法来解析所有文件名列表并生成最有可能的正则表达式模式 有一个名为的Perl模块,它能够为两个不同的字符串生成正则表达式。它给出的例子是
my $diff = String::Diff::diff_regexp('this is Perl', 'this is Ruby');
print "$diff\n";
产出:
this\ is\ (?:Perl|Ruby)
这是\(?:Perl | Ruby)
也许你可以把成对的文件名输入到这类东西中,得到一个初始的正则表达式。然而,这不会让你捕获数字等,所以它不会是完全自动的。在获得差异后,您必须手工编辑或进行某种替换才能得到一个有效的最终正则表达式。首先,您正在努力做到这一点。我怀疑这可能不是不可能的,但你必须应用一些人工智能技术,这将是远比它的价值复杂。假设正则表达式中始终使用
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-number上有23768个多匹配项,那么让脚本每隔500个文件名打印一个多匹配项,这将为您提供47个样本进行检查
可能像
[-/.=]T[0-9]+[-/.=]
这样的东西足以将多个匹配项降到零,同时也为每个文件名提供一次匹配。或者在最坏的情况下,[0-9][-/.=]T[0-9]+[-/.=]
对于Python,请参阅关于TemplateMaker的问题。这是一个非常有趣的问题。每当我必须做regexing时,我都会想到这一点,但从来不敢问,否则人们可能会认为我疯了!!因为我认为这在我看到你发布的链接之前是不可能实现的:)据我所知,这正是RegexMagic的目的:我只记得Loits的人做了一些类似的事情,就是针对这种图像编号(除其他外,他们开发了一个库来导入/导出显微镜图像)。请看此处:/>虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效。