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