que asumiría una expresión regular es mejor que la comprobación de cada subcadena individualmente, porque conceptualmente la expresión regular se modela como un DFA, y así como la entrada se consume todos los partidos se están probando al mismo tiempo (lo que resulta en un escaneo de la cadena de entrada).
lo tanto, aquí está un ejemplo:
import re
def work():
to_find = re.compile("cat|fish|dog")
search_str = "blah fish cat dog haha"
match_obj = to_find.search(search_str)
the_index = match_obj.start() # produces 5, the index of fish
which_word_matched = match_obj.group() # "fish"
# Note, if no match, match_obj is None
ACTUALIZACIÓN: Algunos se debe tener cuidado al combinar palabras a un solo patrón de palabras alternativas. El siguiente código construye una expresión regular, pero escapes any regex special characters y ordena las palabras para que las palabras más largas tienen la oportunidad de igualar antes de que los prefijos más cortos de la misma palabra:
def wordlist_to_regex(words):
escaped = map(re.escape, words)
combined = '|'.join(sorted(escaped, key=len, reverse=True))
return re.compile(combined)
>>> r.search('smash atomic particles').span()
(6, 10)
>>> r.search('visit usenet:comp.lang.python today').span()
(13, 29)
>>> r.search('a north\south division').span()
(2, 13)
>>> r.search('012cat').span()
(3, 6)
>>> r.search('0123dog789cat').span()
(4, 7)
FIN DE ACTUALIZACIÓN
Debería tenga en cuenta que querrá formar la expresión regular (es decir, llamar a re.compile()) lo menos posible. El mejor caso sería que usted sepa de antemano cuáles son sus búsquedas (o las compute una vez/con poca frecuencia) y luego guarde el resultado de re.compilar en alguna parte. Mi ejemplo es simplemente una función sin sentido para que pueda ver el uso de la expresión regular. Hay algunos documentos más expresiones regulares aquí:
http://docs.python.org/library/re.html
Espero que esto ayude.
ACTUALIZACIÓN: estoy seguro acerca de cómo pitón implementa expresiones regulares, pero a contestar la pregunta de Rax acerca de si hay o no limitaciones de re.compile() (por ejemplo, ¿cuántas palabras se puede tratar de " | "juntos para coincidir de una vez), y la cantidad de tiempo para ejecutar la compilación: ninguno de estos parece ser un problema. Probé este código, que es lo suficientemente bueno para convencerme. (Pude haber mejorado esto agregando tiempo y reportando resultados, así como arrojar la lista de palabras en un conjunto para asegurarme de que no haya duplicados ... pero ambas mejoras parecen excesivas). Este código funcionó básicamente de forma instantánea y me convenció de que puedo buscar 2000 palabras (de tamaño 10), y que, de ellas, coincidirán adecuadamente.Aquí está el código:
import random
import re
import string
import sys
def main(args):
words = []
letters_and_digits = "%s%s" % (string.letters, string.digits)
for i in range(2000):
chars = []
for j in range(10):
chars.append(random.choice(letters_and_digits))
words.append(("%s"*10) % tuple(chars))
search_for = re.compile("|".join(words))
first, middle, last = words[0], words[len(words)/2], words[-1]
search_string = "%s, %s, %s" % (last, middle, first)
match_obj = search_for.search(search_string)
if match_obj is None:
print "Ahhhg"
return
index = match_obj.start()
which = match_obj.group()
if index != 0:
print "ahhhg"
return
if words[-1] != which:
print "ahhg"
return
print "success!!! Generated 2000 random words, compiled re, and was able to perform matches."
if __name__ == "__main__":
main(sys.argv)
ACTUALIZACIÓN: Debe tenerse en cuenta que el orden de las cosas ORED juntos en la expresión regular importa. Echar un vistazo a la siguiente prueba inspirada en TZOTZIOY:
>>> search_str = "01catdog"
>>> test1 = re.compile("cat|catdog")
>>> match1 = test1.search(search_str)
>>> match1.group()
'cat'
>>> match1.start()
2
>>> test2 = re.compile("catdog|cat") # reverse order
>>> match2 = test2.search(search_str)
>>> match2.group()
'catdog'
>>> match2.start()
2
Esto sugiere las cuestiones de orden: - /. No estoy seguro de lo que esto significa para la aplicación de Rax, pero al menos se conoce el comportamiento.
ACTUALIZACIÓN: he publicado this questions about the implementation of regular expressions in Python que esperamos que nos dará una idea de los problemas encontrados con esta pregunta.
¿La lista de subcadenas es constante? Lo estoy preguntando porque el uso de soluciones de tipo Regex por lo general implica algunas precomputaciones de la expresión regular (rsp., La lista de subcadenas en su caso). ¿Se amortizaría esa precomputación en muchas búsquedas? – Accipitridae