|  | # Copyright 2014 Google Inc. | 
|  | # | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  |  | 
|  | """Miscellaneous utilities.""" | 
|  |  | 
|  |  | 
|  | import re | 
|  |  | 
|  |  | 
|  | class ReSearch(object): | 
|  | """A collection of static methods for regexing things.""" | 
|  |  | 
|  | @staticmethod | 
|  | def search_within_stream(input_stream, pattern, default=None): | 
|  | """Search for regular expression in a file-like object. | 
|  |  | 
|  | Opens a file for reading and searches line by line for a match to | 
|  | the regex and returns the parenthesized group named return for the | 
|  | first match.  Does not search across newlines. | 
|  |  | 
|  | For example: | 
|  | pattern = '^root(:[^:]*){4}:(?P<return>[^:]*)' | 
|  | with open('/etc/passwd', 'r') as stream: | 
|  | return search_within_file(stream, pattern) | 
|  | should return root's home directory (/root on my system). | 
|  |  | 
|  | Args: | 
|  | input_stream: file-like object to be read | 
|  | pattern: (string) to be passed to re.compile | 
|  | default: what to return if no match | 
|  |  | 
|  | Returns: | 
|  | A string or whatever default is | 
|  | """ | 
|  | pattern_object = re.compile(pattern) | 
|  | for line in input_stream: | 
|  | match = pattern_object.search(line) | 
|  | if match: | 
|  | return match.group('return') | 
|  | return default | 
|  |  | 
|  | @staticmethod | 
|  | def search_within_string(input_string, pattern, default=None): | 
|  | """Search for regular expression in a string. | 
|  |  | 
|  | Args: | 
|  | input_string: (string) to be searched | 
|  | pattern: (string) to be passed to re.compile | 
|  | default: what to return if no match | 
|  |  | 
|  | Returns: | 
|  | A string or whatever default is | 
|  | """ | 
|  | match = re.search(pattern, input_string) | 
|  | return match.group('return') if match else default | 
|  |  |