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