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