Reputation: 33402
I have a list of regexes in python, and a string. Is there an elegant way to check if the at least one regex in the list matches the string? By elegant, I mean something better than simply looping through all of the regexes and checking them against the string and stopping if a match is found.
Basically, I had this code:
list = ['something','another','thing','hello']
string = 'hi'
if string in list:
pass # do something
else:
pass # do something else
Now I would like to have some regular expressions in the list, rather than just strings, and I am wondering if there is an elegant solution to check for a match to replace if string in list:
.
Upvotes: 87
Views: 106394
Reputation: 1
import re
def is_matching_any_regex(text, regex_list):
return text in [re.match(regex, text)[0] for regex in regex_list if re.match(regex, text) is not None]
if __name__ == '__main__':
regex_list = ['hi', '.*hi.*', '.*me.*', 'me']
text = "som3th1ng"
print(is_matching_any_regex(text, regex_list))
text = "something"
print(is_matching_any_regex(text, regex_list))
output:
False
True
Upvotes: 0
Reputation: 447
Here's what I went for based on the other answers:
raw_list = ["some_regex","some_regex","some_regex","some_regex"]
reg_list = map(re.compile, raw_list)
mystring = "some_string"
if any(regex.match(mystring) for regex in reg_list):
print("matched")
Upvotes: 16
Reputation: 10421
If you loop over the strings, the time complexity would be O(n). A better approach would be combine those regexes as a regex-trie.
Upvotes: 2
Reputation: 700
A mix of both Ned's and Nosklo's answers. Works guaranteed for any length of list... hope you enjoy
import re
raw_lst = ["foo.*",
"bar.*",
"(Spam.{0,3}){1,3}"]
reg_lst = []
for raw_regex in raw_lst:
reg_lst.append(re.compile(raw_regex))
mystring = "Spam, Spam, Spam!"
if any(compiled_reg.match(mystring) for compiled_reg in reg_lst):
print("something matched")
Upvotes: 7
Reputation: 222862
import re
regexes = [
# your regexes here
re.compile('hi'),
# re.compile(...),
# re.compile(...),
# re.compile(...),
]
mystring = 'hi'
if any(regex.match(mystring) for regex in regexes):
print 'Some regex matched!'
Upvotes: 108
Reputation: 375594
import re
regexes = [
"foo.*",
"bar.*",
"qu*x"
]
# Make a regex that matches if any of our regexes match.
combined = "(" + ")|(".join(regexes) + ")"
if re.match(combined, mystring):
print "Some regex matched!"
Upvotes: 114