Using Matlab regexp on a cell array to return specific filenames
我有一个文件夹,其中有许多文件,我想创建一个矩阵,其中包含具有特定模式的文件名。例如:该文件夹包含名称以主题编号开头的文件(例如03T1A.xxx.nii,03T1A.yyy.nii)以及中间带有特定模式的文件名(例如03T1A.c100.nii,03T1A.c200)。 nii,03T1A.c300.nii)。在这种特定情况下,我希望提取中间带有模式c1和c2的所有文件名(例如03T1A.c100.nii和03T1A.c200.nii而不是03T1A.c300.nii)。
至此,我已使用以下代码在"模式"中创建模式匹配变量,该变量要应用于通过dir调用提取到变量" all_files"中的文件名单元格数组。
1 2 3 4
| func_path = char(strcat(input_dir, '/', subs (files ), '/Func'));
pattern = 'c[12]*.nii'
all_files = dir(func_path );
all_files = {all_files. name}; |
我想使用(阅读练习)正则表达式,使用字符串输入来完成它似乎很容易,但是我对如何使用单元格输入感到十分困惑。
我开始尝试做这样的事情:
1
| files = all_files (cellfun(@ (x )regexp (x, pattern )); |
但这显然行不通。如果我的最终目标是获取仅包含相关文件名的矩阵输出,有人可以帮我弄清楚该怎么办吗?我一直在搜索MATLAB答案和其他Stack Overflow帖子,但是部分问题是我不了解他们的代码段中正在发生什么。我从另一篇文章中摘录了上面的行(至少是它的开头),但是我不知道例如," x"是什么(输出变量?)或诸如此类的较大命令中的内容
1
| fin = cellfun(@ (x )regexp (x, '\\.', 'split'), res, 'UniformOutput', false ) |
我在另一个线程中发现的。
因此,基本上,有人可以在向我解释该命令的同时帮助我找出一个可以使用的命令吗?
-
regexp本机可用于单元阵列,无需使用cellfun。 另请参见:Regex 101作为构建表达式的游乐场。
-
我最初尝试使用以下命令:x = regexp(all_files,pattern,match)但它返回的空单元格数组的大小与all_files相同。
-
然后您的pattern不匹配任何内容。
-
天哪,你是绝对正确的。 如果我有文件c1004.EXAMPLE.nii和c2004.EXAMPLE.nii,则由于某种原因,模式c [12] *。nii不返回任何内容,但模式c [12]正确返回了两者。 有什么原因吗?
-
@chainhomelow是的,因为c[12]*.nii仅匹配.nii之前的1和2。 您将需要c[12].*\\.nii,以便您可以匹配c1或c2与扩展名之间的字符串中的所有其他内容
有关执行此类操作的一些建议
不要使用strcat和'/'字符来构造文件路径。 strcat在连接之前从所有输入中修剪空白(文件名可能具有实际的前导或尾随空白),并且也不要硬编码文件路径分隔符(如'/'),使用filesep或更好的方法使用fullfile来构建路径以确保它可以在各种平台上正常工作。
1
| func_path = fullfile(input_dir, subs (files ), 'Func'); |
regexp直接在单元阵列上工作,因此您可以简单地执行以下操作:
1 2 3 4 5 6 7
| all_files = dir(func_path );
% Search for the pattern in all filenames
matches = regexp ({all_files. name}, pattern );
% Get the filenames of those that matched
all_files = {all_files (~ cellfun('isempty', matches )). name}; |
您的模式不匹配任何文件,因为它当前仅匹配包含文件扩展名前带有零个或多个1或2的" c"的字符串。相反,您需要使用.*来匹配" c1"或" c2"与文件名之间的所有内容。另外,您也不想在[12]之后使用*,因为它实际上与c3相匹配,因为它的零个1或2。另外,您还希望转义.nii中的.,以免将其视为通配符。对于您的模式,我会使用类似
1
| pattern = 'c[12].*\\.nii'; |
如果您确实不想使用正则表达式,则可以通过在dir调用中仅使用通配符来避免所有这些情况
-
非常感谢您,这确实可以解决问题。 我正在查看正则表达式的用法,是的,通配符使我失望。 显然,您也可以使用c [12] \ S * nii,但是语法更改使我失望。 strcat注释也非常有帮助,并且isempty行可以确保完整性,从而为我提供所需的新数组。 真的很感激。