El anwser sí
regex = '|'.join([r'\b' + str(state) + r'\b' for state in states])
La razón detrás de esto es que la El prefijo 'r' le dice a Python que no analice la cadena que le pasa. Si no pone una 'r' antes de la cadena, Python intentará convertir cualquier carácter precedente por '\' en un carácter especial, para permitirle ingresar líneas de salto (\ n), pestañas (\ t) y tal fácilmente.
Al hacer '\b'
, le dice a Python para crear una cadena, analizarla, y transformar '\ b' en 'retroceso', mientras que cuando lo hace r'\b'
, Python simplemente tienda '\' después 'b', y esto es lo que quieres para regex. Utilice siempre 'r' para la cadena utilizada como patrones de expresiones regulares.
La notación 'r' se llama 'cadena sin procesar', pero eso es engañoso, ya que no existe una cadena sin formato en las partes internas de Python. Solo piénselo como una forma de decirle a Python que evite ser demasiado inteligente.
Hay otra anotación en Python < 3.0, u'string
', que le dice a Python que almacene la cadena como unicode. Puede combinar ambos: ur"é\n"
almacenará "\ bé" como unicode, mientras que u"é\n"
almacenará "é" y luego un salto de línea.
Algunas maneras de mejorar su código:
regex = '|'.join(r'\b' + str(state) + r'\b' for state in states)
eliminado el extra []
. Le dice a Python que no almacene en la memoria la lista de valores que está generando. Podemos hacerlo aquí porque no planeamos reutilizar la lista que está creando ya que la usa directamente en su join()
y en ninguna otra parte.
regex = '|'.join(r'\b%s\b' % state for state in states)
Esto se encargará de la conversión de cadenas automáticamente y es más corto y más limpio.Cuando formatee una cadena en Python, piense en el % operator.
Si los estados contienen una lista de estados de código postal, entonces debe almacenarse como cadena, no como int. En ese caso, puede omitir el tipo de fundición y acortar aún más:
regex = r'\b%s\b' % r'\b|\b'.join(states)
Con el tiempo, puede que no necesite de expresiones regulares en absoluto. Si todo lo que importa es comprobar si uno del código postal está en la cadena dada, sólo puede utilizar in
(comprobar si un artículo está en un iterable, como si una cadena está en una lista):
matches = [s for s in states if s in 'grand rapids, mi 49505']
Última palabra
entiendo que puede ser frustrado cuando el aprendizaje de un nuevo idioma, pero tómese el tiempo para dar un título adecuado a su pregunta. En este sitio web, el título debe terminar con un signo de interrogación y dar detalles específicos sobre el problema.
Nota: Los corchetes son redundantes (en realidad, dañino: la diferencia entre 'O (n)' y 'O (1)' consumo de memoria), use una [expresión del generador] (http://docs.python.org/tutorial/classes.html#generator-expressions) en su lugar. – delnan