summaryrefslogtreecommitdiff
path: root/tools/build/src/util/regex.py
blob: 6348c6fb19339f77b3553a1d29948b3d22e7d580 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#  (C) Copyright David Abrahams 2001. Permission to copy, use, modify, sell and
#  distribute this software is granted provided this copyright notice appears in
#  all copies. This software is provided "as is" without express or implied
#  warranty, and with no claim as to its suitability for any purpose.

import re

from b2.util import bjam_signature


def transform (list, pattern, indices = [1]):
    """ Matches all elements of 'list' agains the 'pattern'
        and returns a list of the elements indicated by indices of
        all successfull matches. If 'indices' is omitted returns
        a list of first paranthethised groups of all successfull
        matches.
    """
    result = []

    for e in list:
        m = re.match (pattern, e)

        if m:
            for i in indices:
                result.append (m.group (i))

    return result


@bjam_signature([['s', 'pattern', 'replacement']])
def replace(s, pattern, replacement):
    """Replaces occurrences of a match string in a given
    string and returns the new string. The match string
    can be a regex expression.

    Args:
        s (str):           the string to modify
        pattern (str):     the search expression
        replacement (str): the string to replace each match with
    """
    return re.sub(pattern, replacement, s)


@bjam_signature((['items', '*'], ['match'], ['replacement']))
def replace_list(items, match, replacement):
    """Replaces occurrences of a match string in a given list of strings and returns
    a list of new strings. The match string can be a regex expression.

    Args:
        items (list):       the list of strings to modify.
        match (str):        the search expression.
        replacement (str):  the string to replace with.
    """
    return [replace(item, match, replacement) for item in items]