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