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