Check for regular expression in a list
Peter Otten
__peter__ at web.de
Fri May 26 11:56:01 EDT 2017
Jussi Piitulainen wrote:
> Surely that should be:
>
> if not 'firefox' in (i.name() for i in process_iter()):
>
> And that again should be:
>
> if any((i.name() == 'firefox') for i in process_iter()):
The previous one certainly looks better than this, particularly if you move
the `not` where it belongs:
if 'firefox' not in (i.name() for i in process_iter()):
Of course you had the next modification in mind when you suggested the above
modificaton.
> Which can then be made into:
>
> if any(i.name().startswith('firefox') for i in process_iter()):
>
> Or use a regex match if the condition becomes more complex. Even then,
> there is re.match to attemp a match at the start of the string, which
> helps to keep the expression simple.
If regular expression objects were to support equality tests in the rigtht
way we could stick with the containment test:
>>> def process_names():
... return (p.name() for p in process_iter())
...
>>> list(process_names())
['foo', 'bar', 'firefox42', 'baz']
>>>
>>> class Match:
... def __init__(self, regex, *args, **kw):
... self._match = re.compile(regex, *args, **kw).match
... def __eq__(self, other):
... try:
... return self._match(other)
... except TypeError:
... return False
...
With the above hidden under the rug the following is quite readable:
>>> Match("FIRE") in process_names()
False
>>> Match("FIRE", re.IGNORECASE) in process_names()
True
>>> Match("FIRE", re.IGNORECASE) not in process_names()
False
>>> Match("FIRE", re.IGNORECASE) in range(3)
False
More information about the Python-list
mailing list