I want to filter strings in a list based on a regular expression.
Is there something better than [x for x in list if r.match(x)] ?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Full Example (Python 3):
For Python 2.x look into Note below
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note below
print(newlist)
Prints:
['cat', 'wildcat', 'thundercat']
Note:
For Python 2.x developers, filter returns a list already. In Python 3.x filter was changed to return an iterator so it has to be converted to list (in order to see it printed out nicely).
Python 3 code example
Python 2.x code example
Method 2
You can create an iterator in Python 3.x or a list in Python 2.x by using:
filter(r.match, list)
To convert the Python 3.x iterator to a list, simply cast it; list(filter(..)).
Method 3
To do so without compiling the Regex first, use a lambda function – for example:
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^d+$', v), values))
print(filtered_values)
Returns:
['123', '234']
filter() just takes a callable as it’s first argument, and returns a list where that callable returned a ‘truthy’ value.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0