On 18 dic, 09:41, tomasz <[EMAIL PROTECTED]> wrote:
> Hi,
>
> here is a piece of pseudo-code (taken from Ruby) that illustrates the
> problem I'd like to solve in Python:
>
> str = 'abc'
> if str =~ /(b)/ # Check if str matches a pattern
> str = $` + $1 # Perform some action
> elsif str =~ /(a)/ # Check another pattern
> str = $1 + $' # Perform some other action
> elsif str =~ /(c)/
> str = $1
> end
>
> The task is to check a string against a number of different patterns
> (containing groupings).
> For each pattern, different actions need to be taken.
>
> In Python, a single match of this kind can be done as follows:
>
> str = 'abc'
> match = re.search( '(b)' , str )
> if match: str = str[0:m.start()] + m.group(1) # I'm not sure if
> this way of accessing 'pre-match'
> # is
> optimal, but let's ignore it now
>
> The problem is that you you can't extend this example to multiple
> matches with 'elif'
> because the match must be performed separately from the conditional.
>
> This obviously won't work in Python:
>
> if match=re.search( pattern1 , str ):
> ...
> elif match=re.search( pattern2 , str ):
> ...
>
> So the only way seems to be:
>
> match = re.search( pattern1 , str ):
> if match:
> ....
> else:
> match = re.search( pattern2 , str ):
> if match:
> ....
> else:
> match = re.search( pattern3 , str ):
> if match:
> ....
>
> and we end up having a very nasty, multiply-nested code.
Define a small function with each test+action, and iterate over them
until a match is found:
def check1(input):
match = re.search(pattern1, input)
if match:
return input[:match.end(1)]
def check2(input):
match = re.search(pattern2, input)
if match:
return ...
def check3(input):
match = ...
if match:
return ...
for check in check1, check2, check3:
result = check(input)
if result is not None:
break
else:
# no match found
--
Gabriel Genellina
--
http://mail.python.org/mailman/listinfo/python-list