• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#  (C) Copyright David Abrahams 2001. Permission to copy, use, modify, sell and
2#  distribute this software is granted provided this copyright notice appears in
3#  all copies. This software is provided "as is" without express or implied
4#  warranty, and with no claim as to its suitability for any purpose.
5
6import re
7
8from b2.util import bjam_signature
9
10
11def transform (list, pattern, indices = [1]):
12    """ Matches all elements of 'list' against the 'pattern'
13        and returns a list of the elements indicated by indices of
14        all successful matches. If 'indices' is omitted returns
15        a list of first paranthethised groups of all successful
16        matches.
17    """
18    result = []
19
20    for e in list:
21        m = re.match (pattern, e)
22
23        if m:
24            for i in indices:
25                result.append (m.group (i))
26
27    return result
28
29
30@bjam_signature([['s', 'pattern', 'replacement']])
31def replace(s, pattern, replacement):
32    """Replaces occurrences of a match string in a given
33    string and returns the new string. The match string
34    can be a regex expression.
35
36    Args:
37        s (str):           the string to modify
38        pattern (str):     the search expression
39        replacement (str): the string to replace each match with
40    """
41    # the replacement string may contain invalid backreferences (like \1 or \g)
42    # which will cause python's regex to blow up. Since this should emulate
43    # the jam version exactly and the jam version didn't support
44    # backreferences, this version shouldn't either. re.sub
45    # allows replacement to be a callable; this is being used
46    # to simply return the replacement string and avoid the hassle
47    # of worrying about backreferences within the string.
48    def _replacement(matchobj):
49        return replacement
50    return re.sub(pattern, _replacement, s)
51
52
53@bjam_signature((['items', '*'], ['match'], ['replacement']))
54def replace_list(items, match, replacement):
55    """Replaces occurrences of a match string in a given list of strings and returns
56    a list of new strings. The match string can be a regex expression.
57
58    Args:
59        items (list):       the list of strings to modify.
60        match (str):        the search expression.
61        replacement (str):  the string to replace with.
62    """
63    return [replace(item, match, replacement) for item in items]
64