J'ai une liste de regexes en python et une chaîne. Existe-t-il un moyen élégant de vérifier si au moins une expression rationnelle de la liste correspond à la chaîne? Par élégant, je veux dire quelque chose de mieux que simplement parcourir toutes les expressions rationnelles et les comparer à la chaîne et s’arrêter si une correspondance est trouvée.
En gros, j'avais ce code:
list = ['something','another','thing','hello']
string = 'hi'
if string in list:
pass # do something
else:
pass # do something else
Maintenant, j'aimerais avoir quelques expressions régulières dans la liste, plutôt que de simples chaînes, et je me demande s'il existe une solution élégante pour vérifier si une correspondance remplace if string in list:
.
Merci d'avance.
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!"
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!'
Un mélange des réponses de Ned et de Nosklo. Travaux garantis pour toute longueur de liste ... espérons que vous apprécierez
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")
Voici ce que j'ai choisi en me basant sur les autres réponses:
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")
Si vous passez en boucle sur les chaînes, la complexité temporelle serait de O (n). Une meilleure approche consisterait à combiner ces expressions rationnelles en une expression rationnelle.