Hello,
I have an if-elif chain in which I'd like to match a string against
several regular expressions. Also I'd like to use the match groups
within the respective elif... block. The C-like idiom that I would
like to use is this:
if (match = my_re1.match(line):
# use match
elsif (match = my_re2.match(line)):
# use match
elsif (match = my_re3.match(line))
# use match
....buy this is illegal in python. The other way is to open up an else:
block in each level, do the assignment and then the test. This
unneccessarily leads to deeper and deeper nesting levels which I find
ugly. Just as ugly as first testing against the RE in the elif: clause
and then, if it matches, to re-evaluate the RE to access the match
groups.
Thanks,
robert 24 1593 bo*******@googlemail.com wrote:
Hello,
I have an if-elif chain in which I'd like to match a string against
several regular expressions. Also I'd like to use the match groups
within the respective elif... block. The C-like idiom that I would
like to use is this:
if (match = my_re1.match(line):
# use match
elsif (match = my_re2.match(line)):
# use match
elsif (match = my_re3.match(line))
# use match
...buy this is illegal in python. The other way is to open up an else:
block in each level, do the assignment and then the test. This
unneccessarily leads to deeper and deeper nesting levels which I find
ugly. Just as ugly as first testing against the RE in the elif: clause
and then, if it matches, to re-evaluate the RE to access the match
groups.
This might help:
-----------
s = "foo"
class Tester(object):
def __call__(self, pattern):
self.m = re.match(pattern, s)
return self.m is not None
def __getattr__(self, name):
return getattr(self.m, name)
test = Tester()
if test("bar"):
print "wrong"
elif test("foo"):
print "right"
-------------
Diez bo*******@googlemail.com wrote:
I have an if-elif chain in which I'd like to match a string against
several regular expressions. Also I'd like to use the match groups
within the respective elif... block. The C-like idiom that I would
like to use is this:
if (match = my_re1.match(line):
# use match
elsif (match = my_re2.match(line)):
# use match
elsif (match = my_re3.match(line))
# use match
...buy this is illegal in python. The other way is to open up an else:
block in each level, do the assignment and then the test. This
unneccessarily leads to deeper and deeper nesting levels which I find
ugly.
How about this (untested) code:
for re in (re1, re2, re3):
match = re.match(line)
if match:
# use it
This requires that "use it" means the same for each regular expression
though...
Uli
--
Sator Laser GmbH
Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932 bo*******@googlemail.com a écrit :
Hello,
I have an if-elif chain in which I'd like to match a string against
several regular expressions. Also I'd like to use the match groups
within the respective elif... block. The C-like idiom that I would
like to use is this:
if (match = my_re1.match(line):
# use match
elsif (match = my_re2.match(line)):
# use match
elsif (match = my_re3.match(line))
# use match
<ot>
Isn't it the third or fourth time this very same question pops up here ?
Starts to look like a FAQ.
</ot>
The canonical solution is to iterate over a list of expression,function
pairs, ie:
def use_match1(match):
# code here
def use_match2(match):
# code here
def use_match3(match):
# code here
for exp, func in [
(my_re1, use_match1),
(my_re2, use_match2),
(my_re3, use_match3)
]:
match = exp.match(line)
if match:
func(match)
break
The alternate solution is Diez's Test object.
HTH
Bruno Desthuilliers <br********************@websiteburo.invalid>
writes:
The canonical solution is to iterate over a list of
expression,function pairs, ie:
Although that solution is pretty, it is not the canonical solution
because it doesn't cover the important case of "if" bodies needing to
access common variables in the enclosing scope. (This will be easier
in Python 3 with 'nonlocal', though.) The snippet posted by Diez is
IMHO closer to a canonical solution to this FAQ.
On May 21, 1:47 pm, Hrvoje Niksic <hnik...@xemacs.orgwrote:
Although that solution is pretty, it is not the canonical solution
because it doesn't cover the important case of "if" bodies needing to
access common variables in the enclosing scope. (This will be easier
in Python 3 with 'nonlocal', though.) The snippet posted by Diez is
IMHO closer to a canonical solution to this FAQ.
Hello everybody,
thanks for the various answers. I'm actually pretty puzzled because I
expected to see some obvious solution that I just hadn't found before.
In general I find Python more elegant and syntactically richer than C
(that's where I come from), so I didn't expect the solutions to be a
lot more verbose and/or ugly (no offense) than the original idea which
would have worked if Python's assignment statement would double as
expression, as in C.
Thanks again,
robert
PS: Since I'm testing only three REs, and I only need the match
results from one of them, I just re-evaluate that one.
On May 21, 3:12 pm, "boblat...@googlemail.com"
<boblat...@googlemail.comwrote:
On May 21, 1:47 pm, Hrvoje Niksic <hnik...@xemacs.orgwrote:
Although that solution is pretty, it is not the canonical solution
because it doesn't cover the important case of "if" bodies needing to
access common variables in the enclosing scope. (This will be easier
in Python 3 with 'nonlocal', though.) The snippet posted by Diez is
IMHO closer to a canonical solution to this FAQ.
Hello everybody,
thanks for the various answers. I'm actually pretty puzzled because I
expected to see some obvious solution that I just hadn't found before.
In general I find Python more elegant and syntactically richer than C
(that's where I come from), so I didn't expect the solutions to be a
lot more verbose and/or ugly (no offense) than the original idea which
would have worked if Python's assignment statement would double as
expression, as in C.
Thanks again,
robert
PS: Since I'm testing only three REs, and I only need the match
results from one of them, I just re-evaluate that one.
Is it really a lot to change to have it
if my_re1.match(line):
match = my_re1.match(line)
elseif my_re2.match(line):
match = my_re2.match(line)
elseif my_re3.match(line):
match = my_re3.match(line)
?
That reads clearly to me... bo*******@googlemail.com wrote:
On May 21, 1:47 pm, Hrvoje Niksic <hnik...@xemacs.orgwrote:
>Although that solution is pretty, it is not the canonical solution because it doesn't cover the important case of "if" bodies needing to access common variables in the enclosing scope. (This will be easier in Python 3 with 'nonlocal', though.) The snippet posted by Diez is IMHO closer to a canonical solution to this FAQ.
Hello everybody,
thanks for the various answers. I'm actually pretty puzzled because I
expected to see some obvious solution that I just hadn't found before.
In general I find Python more elegant and syntactically richer than C
(that's where I come from), so I didn't expect the solutions to be a
lot more verbose and/or ugly (no offense) than the original idea which
would have worked if Python's assignment statement would double as
expression, as in C.
Well, it's a design-decision - and I'm pretty ok with it being a bit verbose
here - as it prevents a *great* deal of programming errors that would
otherwise happen from accidentally writing a = b where a == b was meant.
One could argue that regular expressions - which seem to be THE case where
it bugs people - should offer a standard way that essentially works as my
solution - by keeping state around, making series of tests easier.
Diez co*********@gmail.com wrote:
On May 21, 3:12 pm, "boblat...@googlemail.com"
<boblat...@googlemail.comwrote:
>On May 21, 1:47 pm, Hrvoje Niksic <hnik...@xemacs.orgwrote:
Although that solution is pretty, it is not the canonical solution
because it doesn't cover the important case of "if" bodies needing to
access common variables in the enclosing scope. (This will be easier
in Python 3 with 'nonlocal', though.) The snippet posted by Diez is
IMHO closer to a canonical solution to this FAQ.
Hello everybody,
thanks for the various answers. I'm actually pretty puzzled because I expected to see some obvious solution that I just hadn't found before. In general I find Python more elegant and syntactically richer than C (that's where I come from), so I didn't expect the solutions to be a lot more verbose and/or ugly (no offense) than the original idea which would have worked if Python's assignment statement would double as expression, as in C.
Thanks again, robert
PS: Since I'm testing only three REs, and I only need the match results from one of them, I just re-evaluate that one.
Is it really a lot to change to have it
if my_re1.match(line):
match = my_re1.match(line)
elseif my_re2.match(line):
match = my_re2.match(line)
elseif my_re3.match(line):
match = my_re3.match(line)
?
That reads clearly to me...
And wastes time. regular expressions can become expensive to match - doing
it twice might be hurtful.
Diez
>
And wastes time. regular expressions can become expensive to match - doing
it twice might be hurtful.
Diez
match = (my_re1.match(line) or my_re2.match(line)) or
my_re3.match(line)
? co*********@gmail.com wrote:
>> And wastes time. regular expressions can become expensive to match - doing it twice might be hurtful.
Diez
match = (my_re1.match(line) or my_re2.match(line)) or
my_re3.match(line)
How do you know *which* of the three has matched then?
Diez
On May 21, 4:09 pm, "Diez B. Roggisch" <de...@nospam.web.dewrote:
cokofree...@gmail.com wrote:
And wastes time. regular expressions can become expensive to match -
doing it twice might be hurtful.
Diez
match = (my_re1.match(line) or my_re2.match(line)) or
my_re3.match(line)
How do you know *which* of the three has matched then?
Diez
Depends if the OP wants to know that...
one of the few things i miss from C is being able to use assignment in
expressions. that's the only thing, really.
also there's no switch/case, you have to use a dictionary of functions
instead, although i rarely need that, usually i just use elif.
<bo*******@googlemail.comwrote in message
news:7d**********************************@26g2000h sk.googlegroups.com...
On May 21, 1:47 pm, Hrvoje Niksic <hnik...@xemacs.orgwrote:
>Although that solution is pretty, it is not the canonical solution because it doesn't cover the important case of "if" bodies needing to access common variables in the enclosing scope. (This will be easier in Python 3 with 'nonlocal', though.) The snippet posted by Diez is IMHO closer to a canonical solution to this FAQ.
Hello everybody,
thanks for the various answers. I'm actually pretty puzzled because I
expected to see some obvious solution that I just hadn't found before.
In general I find Python more elegant and syntactically richer than C
(that's where I come from), so I didn't expect the solutions to be a
lot more verbose and/or ugly (no offense) than the original idea which
would have worked if Python's assignment statement would double as
expression, as in C.
Thanks again,
robert
PS: Since I'm testing only three REs, and I only need the match
results from one of them, I just re-evaluate that one.
co*********@gmail.com wrote:
On May 21, 4:09 pm, "Diez B. Roggisch" <de...@nospam.web.dewrote:
>cokofree...@gmail.com wrote:
>And wastes time. regular expressions can become expensive to match - doing it twice might be hurtful.
>Diez
match = (my_re1.match(line) or my_re2.match(line)) or
my_re3.match(line)
How do you know *which* of the three has matched then?
Diez
Depends if the OP wants to know that...
Well, in *general* one wants that. So as a general-purpose solution this is
certainly *not* the way to go.
Diez
On May 21, 4:57 pm, "inhahe" <inh...@gmail.comwrote:
one of the few things i miss from C is being able to use assignment in
expressions. that's the only thing, really.
also there's no switch/case, you have to use a dictionary of functions
instead, although i rarely need that, usually i just use elif.
One thing I hate from C is the assignment in expressions...Forcing
myself to write
0 == Something
rather than
Something == 0
just to make sure I was mistakenly assigning values in statements is
annoying, it ruins the ease of reading.
I kind of agree with the select:case, but I think a key issue is how
to implement it. Elif is reasonable for now.
Diez, true I guess, but then we haven't seen what these expressions
are, and why there has to be three.
On 21 Mai, 11:38, boblat...@googlemail.com wrote:
Hello,
I have an if-elif chain in which I'd like to match a string against
several regular expressions. Also I'd like to use the match groups
within the respective elif... block. The C-like idiom that I would
like to use is this:
if (match = my_re1.match(line):
# use match
elsif (match = my_re2.match(line)):
# use match
elsif (match = my_re3.match(line))
# use match
...buy this is illegal in python. The other way is to open up an else:
block in each level, do the assignment and then the test. This
unneccessarily leads to deeper and deeper nesting levels which I find
ugly. Just as ugly as first testing against the RE in the elif: clause
and then, if it matches, to re-evaluate the RE to access the match
groups.
Thanks,
robert
You are perfectly correct. Pythons design is lacking here IMO. But
what is your question?
<co*********@gmail.comwrote in message
news:06**********************************@p25g2000 hsf.googlegroups.com...
On May 21, 4:57 pm, "inhahe" <inh...@gmail.comwrote:
>one of the few things i miss from C is being able to use assignment in expressions. that's the only thing, really. also there's no switch/case, you have to use a dictionary of functions instead, although i rarely need that, usually i just use elif.
One thing I hate from C is the assignment in expressions...Forcing
myself to write
0 == Something
rather than
Something == 0
interesting trick, i've never thought of that/seen it
although if Python implemented it I think it should default to giving
warnings when you use = in an expression, that way you don't have to worry.
just to make sure I was mistakenly assigning values in statements is
annoying, it ruins the ease of reading.
I kind of agree with the select:case, but I think a key issue is how
to implement it. Elif is reasonable for now.
Diez, true I guess, but then we haven't seen what these expressions
are, and why there has to be three.
>>
>One thing I hate from C is the assignment in expressions...Forcing myself to write 0 == Something rather than Something == 0
interesting trick, i've never thought of that/seen it
although if Python implemented it I think it should default to giving
warnings when you use = in an expression, that way you don't have to
worry.
That introduces complications though, do you want to see a pagefull of
warnings every time you import a module that uses the ='s?
You could specify in your python file that you want to suppress that
warning, but then you'd never know when you used = by accident when you
meant to use ==.
anyway i was thinking you could have a second assignment operator to use
just in expressions, and only allow that. it could be := since some
languages tend to use that. i wouldn't like it as a general assignment
operator but assignment in expressions is a special case. also <- or ->.
C uses -for functions but I think math/calculators use that for
assignment.
On May 21, 5:50 pm, "inhahe" <inh...@gmail.comwrote:
One thing I hate from C is the assignment in expressions...Forcing
myself to write
0 == Something
rather than
Something == 0
interesting trick, i've never thought of that/seen it
although if Python implemented it I think it should default to giving
warnings when you use = in an expression, that way you don't have to
worry.
That introduces complications though, do you want to see a pagefull of
warnings every time you import a module that uses the ='s?
You could specify in your python file that you want to suppress that
warning, but then you'd never know when you used = by accident when you
meant to use ==.
anyway i was thinking you could have a second assignment operator to use
just in expressions, and only allow that. it could be := since some
languages tend to use that. i wouldn't like it as a general assignment
operator but assignment in expressions is a special case. also <- or ->.
C uses -for functions but I think math/calculators use that for
assignment.
My preference would be ?=.
if match ?= my_re1.match(line):
# use match
elif match ?= my_re2.match(line):
# use match
elif match ?= my_re3.match(line):
# use match
On May 21, 11:38 am, boblat...@googlemail.com wrote:
if (match = my_re1.match(line):
# use match
elsif (match = my_re2.match(line)):
# use match
elsif (match = my_re3.match(line))
# use match
...buy this is illegal in python.
Assignment expressions is disallowed in Python to protect against a
very common bug in C/C++ programs, the (accidental) confusion of
if (match = my_re1.match(line))
with
if (match == my_re1.match(line))
or vice versa.
On May 21, 10:38 am, boblat...@googlemail.com wrote:
Hello,
I have an if-elif chain in which I'd like to match a string against
several regular expressions. Also I'd like to use the match groups
within the respective elif... block. The C-like idiom that I would
like to use is this:
if (match = my_re1.match(line):
# use match
elsif (match = my_re2.match(line)):
# use match
elsif (match = my_re3.match(line))
# use match
...buy this is illegal in python. The other way is to open up an else:
block in each level, do the assignment and then the test. This
unneccessarily leads to deeper and deeper nesting levels which I find
ugly. Just as ugly as first testing against the RE in the elif: clause
and then, if it matches, to re-evaluate the RE to access the match
groups.
Thanks,
robert
You could use named groups to search for all three patterns at once
like this:
original:
prog1 = re.compile(r'pat1')
prog2 = re.compile(r'pat2')
prog3 = re.compile(r'pat3')
...
Becomes:
prog = re.compile(r'(?P<p1>pat1)|(?P<p2>pat2)|(?P<p3>pat3 )')
match = prog.match(line)
for p in 'p1 p2 p3'.split():
if match.groupdict()[p]:
do_something_for_prog(p)
- Paddy.
On 21 Mai, 19:56, sturlamolden <sturlamol...@yahoo.nowrote:
On May 21, 11:38 am, boblat...@googlemail.com wrote:
if (match = my_re1.match(line):
# use match
elsif (match = my_re2.match(line)):
# use match
elsif (match = my_re3.match(line))
# use match
...buy this is illegal in python.
Assignment expressions is disallowed in Python to protect against a
very common bug in C/C++ programs, the (accidental) confusion of
if (match = my_re1.match(line))
with
if (match == my_re1.match(line))
or vice versa.
This is just a syntactical issue. But what is the *value* of an
assigment? In Python it is always None: assigments are statements, not
expressions.
However Guido and team have found a *pragmatic* solution for this at
another place:
with open("myFile") as f:
BLOCK
Compare this with a possible syntactical form of an if-statement:
if EXPR as NAME:
BLOCK
This isn't ugly syntax-wise. It's just a bit harder to understand the
semantics of an if-statement. It might read like this:
"Evaluate EXPR and compute bool(EXPR). If this value is True assign
EXPR to NAME and execute BLOCK. Otherwise refuse both assigment and
BLOCK execution."
Maybe assignment can be performed unconditionally as in the C case.
I'm not sure about this.
On 2008-05-21, Diez B. Roggisch <de***@nospam.web.dewrote:
bo*******@googlemail.com wrote:
>On May 21, 1:47 pm, Hrvoje Niksic <hnik...@xemacs.orgwrote:
>>Although that solution is pretty, it is not the canonical solution because it doesn't cover the important case of "if" bodies needing to access common variables in the enclosing scope. (This will be easier in Python 3 with 'nonlocal', though.) The snippet posted by Diez is IMHO closer to a canonical solution to this FAQ.
Hello everybody,
thanks for the various answers. I'm actually pretty puzzled because I expected to see some obvious solution that I just hadn't found before. In general I find Python more elegant and syntactically richer than C (that's where I come from), so I didn't expect the solutions to be a lot more verbose and/or ugly (no offense) than the original idea which would have worked if Python's assignment statement would double as expression, as in C.
Well, it's a design-decision - and I'm pretty ok with it being a bit verbose
here - as it prevents a *great* deal of programming errors that would
otherwise happen from accidentally writing a = b where a == b was meant.
But that is an error that occurs because of the specific symbols chosen
to represent an assignment or equality test. At the time python was
first designed, other symbols for assignment were already used for
in other languages, like := and <-
So if preventing errors was the main motivation why not allow an
assignment to be an expression but use a symbol for the assignment
that would prevent those kind of errors?
I find it hard to believe that a design choice like whether or not
to have the assignment behave as an expression or not, was decided
on the ground of a particulare lexical representation of the assignment
symbol.
--
Antoon Pardon
On May 21, 4:38*am, boblat...@googlemail.com wrote:
Hello,
I have an if-elif chain in which I'd like to match a string against
several regular expressions. Also I'd like to use the match groups
within the respective elif... block. The C-like idiom that I would
like to use is this:
if (match = my_re1.match(line):
* # use match
elsif (match = my_re2.match(line)):
* # use match
elsif (match = my_re3.match(line))
* # use match
...buy this is illegal in python. The other way is to open up an else:
block in each level, do the assignment and then the test. This
unneccessarily leads to deeper and deeper nesting levels which I find
ugly. Just as ugly as first testing against the RE in the elif: clause
and then, if it matches, to re-evaluate the RE to access the match
groups.
Thanks,
robert
Try this.
-- Paul
class TestValue(object):
"""Class to support assignment and test in single operation"""
def __init__(self,v=None):
self.value = v
"""Add support for quasi-assignment syntax using '<<' in place of
'='."""
def __lshift__(self,other):
self.value = other
return bool(self.value)
import re
tv = TestValue()
integer = re.compile(r"[-+]?\d+")
real = re.compile(r"[-+]?\d*\.\d+")
word = re.compile(r"\w+")
for inputValue in ("123 abc 3.1".split()):
if (tv << real.match(inputValue)):
print "Real", float(tv.value.group())
elif (tv << integer.match(inputValue)):
print "Integer", int(tv.value.group())
elif (tv << word.match(inputValue)):
print "Word", tv.value.group()
Prints:
Integer 123
Word abc
Real 3.1
This version is a bit better, since it follows the convention that
'<<' should return self.
class TestValue(object):
"""Class to support assignment and test in single operation"""
def __init__(self,v=None):
self.value = v
"""Add support for quasi-assignment syntax using '<<' in place of
'='."""
def __lshift__(self,other):
self.value = other
return self
def __bool__(self):
return bool(self.value)
__nonzero__ = __bool__
-- Paul This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Paul Rubin |
last post by:
OK, I want to scan a file for lines matching a certain regexp. I'd
like to use an assignment expression, like
for line in file:
if (g := re.match(pat, line)):
croggle(g.group(1))
Since...
|
by: MeoLessi9 |
last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
|
by: DolphinDB |
last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation.
Take...
|
by: DolphinDB |
last post by:
Tired of spending countless mintues downsampling your data? Look no further!
In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
|
by: Aftab Ahmad |
last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below.
Dim IE As Object
Set IE =...
|
by: ryjfgjl |
last post by:
ExcelToDatabase: batch import excel into database automatically...
|
by: marcoviolo |
last post by:
Dear all,
I would like to implement on my worksheet an vlookup dynamic , that consider a change of pivot excel via win32com, from an external excel (without open it) and save the new file into a...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: jfyes |
last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
|
by: PapaRatzi |
last post by:
Hello,
I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
| |