On 02/25/2011 10:27 AM, Seldon wrote:
Hi all,
I have to convert integer ranges expressed in a popular "compact"
notation (e.g. 2, 5-7, 20-22, 41) to a the actual set of numbers (i.e.
2,5,7,20,21,22,41).

Is there any library for doing such kind of things or I have to write it
from scratch ?


In addition to the solutions given by others (thanks!), just for reference I paste below what I have written to solve my little problem: comments are welcome !

-------------------

# Define exceptions
class MalformedRangeListError(Exception): pass # raised if a string is\ not a valid numeric range list


def num_range_list_to_num_set(range_list, sep=','):
    """
    Convert a numeric list of ranges to the set of numbers it represents.

    @argument
range_list: a numeric list of ranges, as a string of values separated by `sep` (e.g. '1, 3-5, 7')

    @argument:
    sep: a string used as a separator in `range_list` (e.g. ',', ' ')

    @return: the set represented by `range_list` (i.e. (1,3,4,5,7)).

    """

# if given an empty range list, the function should return the\ empty set
    if range_list == '': return set()

    import re
int_or_range = r'^([1-9]\d*)(?:-([1-9]\d*))?$' # match a single decimal number or a range of decimal numbers
    r = re.compile(int_or_range)

    # split the input string in a list of numbers and numeric ranges
    l = range_list.split(sep)
    result = set()
    for s in l:
        # check if the current string is a number or a valid numeric range
        m = r.match(s)
        if not m:
raise MalformedRangeListError, "Input string is not a valid numeric range-list" matches = len(filter(lambda x:x, m.groups())) # how many regexp\ groups matched
        first = m.group(1)
        if matches == 2: # it's a range
            if m.group(1) > m.group(2):
raise MalformedRangeListError, "Input string is not a\ valid numeric range-list"
            last = m.group(2)
result.update(range(int(first), int(last)+1)) # current\ item is a range, so add the full numeric range to the result set
        elif matches == 1: # it's a number
result.add(int(first)) # current item is a number, so just\ add it to the result set
        else:
raise MalformedRangeListError, "Input string is not a valid numeric range-list"
    return result
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to