Index: /issm/trunk-jpl/test/NightlyRun/runme.m
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/runme.m	(revision 26349)
+++ /issm/trunk-jpl/test/NightlyRun/runme.m	(revision 26350)
@@ -2,10 +2,12 @@
 %RUNME - test deck for ISSM nightly runs
 %
-%   In a test deck directory (test/Vertification/NightlyRun for example)
-%   The following command will launch all the existing tests:
-%   >> runme
-%   To run the tests 101 and 102:
-%   >> runme('id',[101 102])
-%   etc...
+%   In a test deck directory (for example, test/NightlyRun) the following 
+%   command will launch all existing tests,
+%
+%      >> runme
+%
+%   To run tests 101 and 102,
+%
+%      >> runme('id',[101 102])
 %
 %   Available options:
@@ -24,5 +26,4 @@
 %                      'thermal'     : validation of thermal tests
 %                      'tranforcing' : validation of transient forcing tests
-%                      ...
 %      'procedure'     'check' :   run the test (default)
 %                      'update':   update the archive
@@ -37,6 +38,13 @@
 %      runme('exclude',101);
 %      runme('id',102,'procedure','update');
-
 %      runme('procedure','valgrind','stoponerror',1,'exclude','IdFromString('Dak'));
+%
+%   NOTE:
+%   - Will only run test scripts whose names explicitly follow the convention,
+%
+%         test<id>.m
+%
+%   where <id> is any integer.
+%
 
 %Check inputs
@@ -82,16 +90,20 @@
 list_ids=[];
 for i=1:numel(flist),
-	if ( strncmp(flist(i).name,'test',4) &...                         %File name must start with 'test'
-			strncmp(fliplr(flist(i).name),fliplr('.m'),2)&...           %File name must end by '.m'
-			~strcmp(flist(i).name,'test.m'))                            %File name must be different than 'test.m'
-		id=str2num(flist(i).name(5:end-2));
-		if isempty(id),
-			disp(['WARNING: ignore file ' flist(i).name ]);
-		else
-			list_ids(end+1)=eval(flist(i).name(5:end-2));                  %Keep test id only (skip 'test' and '.m')
+	fname=flist(i).name;
+	if (contains(fname,'.')), %Before split, check that file name contains '.'
+		ftokens=string(split(fname,'.')); %Tokenize file name on '.'
+		if (regexp(ftokens{1},'^test[0-9]+$') &... %Basename must start with 'test' and end with a number
+			strcmp(ftokens{end},'m') ... %Extension (less '.') must be 'm'
+		),
+			id=sscanf(ftokens{1},'test%d');
+			if isempty(id),
+				disp(['WARNING: ignore file ' flist(i).name]);
+			else
+				list_ids(end+1)=id;%Keep test id only (strip 'test' and '.m')
+			end
 		end
 	end
 end
-[i1,i2]=parallelrange(rank,numprocs,length(list_ids));               %Get tests for this cpu only
+[i1,i2]=parallelrange(rank,numprocs,length(list_ids)); %Get tests for this cpu only
 list_ids=list_ids(i1:i2);
 
Index: /issm/trunk-jpl/test/NightlyRun/runme.py
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/runme.py	(revision 26349)
+++ /issm/trunk-jpl/test/NightlyRun/runme.py	(revision 26350)
@@ -3,4 +3,5 @@
 from glob import glob
 import os
+import re
 from sys import float_info
 from traceback import format_exc
@@ -22,10 +23,10 @@
     """RUNME - test deck for ISSM nightly runs
 
-    In a test deck directory (test/NightlyRun for example), the following 
-    command will launch all the existing tests,
+    In a test deck directory (for example, test/NightlyRun) the following 
+    command will launch all existing tests,
 
         ./runme.py
 
-    To run tests 101 and 102:
+    To run tests 101 and 102,
 
         ./runme.py -i [101, 102]
@@ -34,8 +35,6 @@
         -i/--id             followed by the list of ids or (parts of) test names requested
                             NOTE: runs all tests by default
-
         -e/--exclude        ids or (parts of) test names to be excluded (same format as id)
                             NOTE: exclude does nothing if 'id' is specified with different values
-
         -b/--benchmark      'all'           : (all of the tests)
                             'nightly'       : (nightly run/daily run)
@@ -50,5 +49,4 @@
                             'thermal'       : validation of thermal tests
                             'tranforcing'   : validation of transient forcing tests
-
         -p/--procedure      'check'         : run the test (default)
                             'update'        : update the archive
@@ -65,8 +63,17 @@
         ./runme.py -i [[101, 102], ['Dakota', 'Slc']]
 
+    NOTE:
+    - Will only run test scripts whose names explicitly follow the convention,
+
+        test<id>.py
+
+    where <id> is any integer.
+
     TODO:
     - At '#disp test result', make sure precision of output matches that of 
-        MATLAB.
-    - Check for failures that do not raise exceptions (for example, 'Standard exception'; see also jenkins/jenkins.sh). These should be counted as failures.
+    MATLAB.
+    - Check for failures that do not raise exceptions (for example, 'Standard 
+    exception'; see also jenkins/jenkins.sh). These should be counted as 
+    failures.
     """
 
@@ -96,5 +103,5 @@
     #GET ids  {{{
     flist = glob('test*.py')  #File name must start with 'test' and must end by '.py' and must be different than 'test.py'
-    list_ids = [int(file[4:-3]) for file in flist if not file == 'test.py']  #Keep test id only (skip 'test' and '.py')
+    list_ids = [int(re.search(r'\d+',file.split('.')[0]).group()) for file in flist if not file == 'test.py'] #Keep test id only (skip 'test' and '.py')
 
     i1, i2 = parallelrange(rank, numprocs, len(list_ids))  #Get tests for this cpu only
