web-dev-qa-db-fra.com

Python: Élégant de vérifier si moins l'expression rationnelle de la liste correspond

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.

47
houbysoft
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!"
72
Ned Batchelder
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!'
81
nosklo

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")
4
Anderas

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")
1
user5056973

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.

0
ospider