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