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