You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.7 KiB
59 lines
1.7 KiB
# Copyright 2014 Google Inc. |
|
# |
|
# Use of this source code is governed by a BSD-style license that can be |
|
# found in the LICENSE file. |
|
|
|
|
|
"""Miscellaneous utilities.""" |
|
|
|
|
|
import re |
|
|
|
|
|
class ReSearch(object): |
|
"""A collection of static methods for regexing things.""" |
|
|
|
@staticmethod |
|
def search_within_stream(input_stream, pattern, default=None): |
|
"""Search for regular expression in a file-like object. |
|
|
|
Opens a file for reading and searches line by line for a match to |
|
the regex and returns the parenthesized group named return for the |
|
first match. Does not search across newlines. |
|
|
|
For example: |
|
pattern = '^root(:[^:]*){4}:(?P<return>[^:]*)' |
|
with open('/etc/passwd', 'r') as stream: |
|
return search_within_file(stream, pattern) |
|
should return root's home directory (/root on my system). |
|
|
|
Args: |
|
input_stream: file-like object to be read |
|
pattern: (string) to be passed to re.compile |
|
default: what to return if no match |
|
|
|
Returns: |
|
A string or whatever default is |
|
""" |
|
pattern_object = re.compile(pattern) |
|
for line in input_stream: |
|
match = pattern_object.search(line) |
|
if match: |
|
return match.group('return') |
|
return default |
|
|
|
@staticmethod |
|
def search_within_string(input_string, pattern, default=None): |
|
"""Search for regular expression in a string. |
|
|
|
Args: |
|
input_string: (string) to be searched |
|
pattern: (string) to be passed to re.compile |
|
default: what to return if no match |
|
|
|
Returns: |
|
A string or whatever default is |
|
""" |
|
match = re.search(pattern, input_string) |
|
return match.group('return') if match else default |
|
|
|
|