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);