Home | History | Annotate | Download | only in tools
      1 # Copyright 2014 Google Inc.
      2 #
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 
      7 """Miscellaneous utilities."""
      8 
      9 
     10 import re
     11 
     12 
     13 class ReSearch(object):
     14   """A collection of static methods for regexing things."""
     15 
     16   @staticmethod
     17   def search_within_stream(input_stream, pattern, default=None):
     18     """Search for regular expression in a file-like object.
     19 
     20     Opens a file for reading and searches line by line for a match to
     21     the regex and returns the parenthesized group named return for the
     22     first match.  Does not search across newlines.
     23 
     24     For example:
     25         pattern = '^root(:[^:]*){4}:(?P<return>[^:]*)'
     26         with open('/etc/passwd', 'r') as stream:
     27             return search_within_file(stream, pattern)
     28     should return root's home directory (/root on my system).
     29 
     30     Args:
     31         input_stream: file-like object to be read
     32         pattern: (string) to be passed to re.compile
     33         default: what to return if no match
     34 
     35     Returns:
     36         A string or whatever default is
     37     """
     38     pattern_object = re.compile(pattern)
     39     for line in input_stream:
     40       match = pattern_object.search(line)
     41       if match:
     42         return match.group('return')
     43     return default
     44 
     45   @staticmethod
     46   def search_within_string(input_string, pattern, default=None):
     47     """Search for regular expression in a string.
     48 
     49     Args:
     50         input_string: (string) to be searched
     51         pattern: (string) to be passed to re.compile
     52         default: what to return if no match
     53 
     54     Returns:
     55         A string or whatever default is
     56     """
     57     match = re.search(pattern, input_string)
     58     return match.group('return') if match else default
     59 
     60