Source code for niftynet.utilities.user_parameters_regex
# -*- coding: utf-8 -*-
# regular expressions to match tuples from user inputs
# kindly provided by
# Luis Carlos Garcia Peraza Herrera <luis.herrera.14@ucl.ac.uk>
from __future__ import unicode_literals
import re
INT = r'(?:[-+]?\d+)'
FLOAT = r'(?:[-+]?\d*\.\d+|' + INT + r')'
LITERAL = r'(?:[-_a-zA-Z0-9 \\:]+)'
COMMA = r'(?:[,])'
LEFT_PARENTHESIS = r'(?:\()'
RIGHT_PARENTHESIS = r'(?:\))'
LEFT_BRACKET = r'(?:[{])'
RIGHT_BRACKET = r'(?:[}])'
OPTIONAL_BLANK = r'(?:[ \t\r\n]?)'
OPTIONAL_BLANKS = r'(?:' + OPTIONAL_BLANK + r'+)'
OR = r'|'
TUPLE = \
r'(?:' \
+ r'(?:' \
+ r'(?:' \
+ OPTIONAL_BLANKS + FLOAT + OPTIONAL_BLANKS + COMMA \
+ r')*' \
+ OPTIONAL_BLANKS + FLOAT + OPTIONAL_BLANKS \
+ r')' \
+ OR \
+ r'(?:' \
+ r'(?:' \
+ OPTIONAL_BLANKS + LITERAL + OPTIONAL_BLANKS + COMMA \
+ r')*' \
+ OPTIONAL_BLANKS + LITERAL + OPTIONAL_BLANKS \
+ r')' \
+ r')'
STATEMENT = \
r'^' \
+ LEFT_PARENTHESIS + r'(' + TUPLE + r')?' + RIGHT_PARENTHESIS + r'$' \
+ OR \
+ r'^' + LEFT_BRACKET + r'(' + TUPLE + r')?' + RIGHT_BRACKET + r'$' \
+ OR \
+ r'^(' + TUPLE + r')?$'
[docs]def match_array(string_input, type_str):
regex = re.compile(STATEMENT)
matched_str = regex.match(string_input)
if matched_str:
filtered_groups = list(filter(None, matched_str.groups()))
if not filtered_groups:
return ()
try:
values = [v.strip() for v in filtered_groups[0].split(',')]
except IndexError:
raise ValueError(
"unrecognised input string {}".format(string_input))
if type_str == 'int':
return tuple(map(int, values))
if type_str == 'float':
return tuple(map(float, values))
if type_str == 'str':
return tuple(values)
else:
raise ValueError("unknown array type_str {}".format(string_input))
else:
raise ValueError("invalid parameter {}".format(string_input))