def patternToExpression(pattern): """Convert pattern to regular expression Arguments: pattern (object): regular expression pattern Returns: str: regular expression """ ire.patternToExpression(pattern);
def test(): import ClearMap.Utils.InverseRegularExpression as ire; import sre_parse as sre; reload(ire) source = '/test/test_(?P<row>\d{4})_(?P<col>\d{3}).tif'; p = sre.parse(source); ire.patternToExpression(p) reload(ire) source = r'/test/test_(?:\d)_(?P<col>\d{3})_[7-9][.](?=col)tif$'; p = sre.parse(source); ire.patternToExpression(p)
def globToExpression(expression, groups = None): """Converts a glob expression to a regular expression Arguments: expression (str): glob expression groups (dict or None): a dicitonary specifying named groups in the form id: name Returns: str: regular expression """ regex = fnmatch.translate(expression); regex = insertGroups(regex, groups = groups); if groups is None: regex = ire.patternToExpression(sre.parse(regex)); return regex;
def replace(expression, replace = None): """Replaces patterns in a regular expression with given strings Arguments: expression (str): regular expression replace (dict): replacements of patterns given as entries group id : str or group name : str Returns: str: converted regular expression """ if not isinstance(replace, dict): return expression; #parse regular expression pattern = sre.parse(expression); #group patterns gd = pattern.pattern.groupdict gdi = {y:x for x,y in gd.items()}; gkeys = gdi.keys(); rkeys = replace.keys(); newpattern = []; for p in pattern: if p[0] == sre.SUBPATTERN: sid = p[1][0]; if sid is not None: if sid in rkeys: newpattern += [(ire.TEXT, replace[sid])]; elif sid in gkeys: gn = gdi[sid]; if gn in rkeys: newpattern += [(ire.TEXT, replace[gn])]; else: newpattern.append(p); else: newpattern.append(p); else: newpattern.append(p); else: newpattern.append(p); pattern.data = newpattern; return ire.patternToExpression(pattern);
def expressionToGlob(expression, replace = all, default = '*'): """Converts regular expression to a glob expression to search for files""" if not isinstance(replace, dict): replace = {}; #parse regular expression pattern = sre.parse(expression); #group patterns gd = pattern.pattern.groupdict gdi = {y:x for x,y in gd.items()}; gkeys = gdi.keys(); rkeys = replace.keys(); defp = [(ire.TEXT, default)]; newpattern = []; for p in pattern: if p[0] == sre.SUBPATTERN: sid = p[1][0]; if sid is not None: if sid in rkeys: newpattern += [(ire.TEXT, replace[sid])]; elif sid in gkeys: gn = gdi[sid]; if gn in rkeys: newpattern += [(ire.TEXT, replace[gn])]; else: newpattern += defp; else: newpattern += defp; else: newpattern += defp; else: newpattern.append(p); pattern.data = newpattern; return ire.patternToExpression(pattern);
def insertGroups(expression, groups = None): """Inserts group names into a regular expression at specified sub patterns Arguments: expression (str): regular expression groups (dict or None): dictionary specifining the group names as groupid : groupname Returns: str: regular expression with named groups """ if not isinstance(groups, dict): return expression; pattern = sre.parse(expression); #group patterns gd = pattern.pattern.groupdict for i,n in groups.items(): gd[n] = i; pattern.pattern.groupdict = gd; return ire.patternToExpression(pattern);