Check for regular expression in a list

Jussi Piitulainen jussi.piitulainen at helsinki.fi
Fri May 26 08:25:20 EDT 2017


Rustom Mody <rustompmody at gmail.com> writes:

> On Friday, May 26, 2017 at 5:02:55 PM UTC+5:30, Cecil Westerhof wrote:
>> To check if Firefox is running I use:
>>     if not 'firefox' in [i.name() for i in list(process_iter())]:
>> 
>> It probably could be made more efficient, because it can stop when it
>> finds the first instance.
>> 
>> But know I switched to Debian and there firefox is called firefox-esr.
>> So I should use:
>>     re.search('^firefox', 'firefox-esr')
>> 
>> Is there a way to rewrite
>>     [i.name() for i in list(process_iter())]
>> 
>> so that it returns True when there is a i.name() that matches and
>> False otherwise?
>> And is it possible to stop processing the list when it found a match?
>
> 'in' operator is lazily evaluated if its rhs is an iterable (it looks)
> So I expect you can replace
> if not 'firefox' in [i.name() for i in list(process_iter())]:
> with
> if not 'firefox' in (i.name() for i in list(process_iter())]):

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()):

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.

Redundancy of parentheses is a bit subtle above - the generator
expression as the sole argument to any() does not need them, and the
parentheses of (i.name() == 'firefox') are not necessary.

As to early exit:

    >>> s = iter('abracadabra')
    >>> any(c == 'c' for c in s)
    True
    >>> list(s)
    ['a', 'd', 'a', 'b', 'r', 'a']
    >>> 



More information about the Python-list mailing list