2012-03-30 12 views
15

Tengo una cadena y quiero hacer coincidir algo al principio y final con un único patrón de búsqueda. ¿Cómo puede hacerse esto?¿Cómo puedo unir el inicio y el final en la expresión regular de Python?

Digamos que tenemos una cadena como:

string = "ftp://www.somewhere.com/over/the/rainbow/image.jpg" 

que quiero hacer algo como esto:

re.search("^ftp:// & .jpg$" ,string) 

Obviamente, es incorrecto, pero espero que llegue mi punto de vista. es posible?

+1

¿Pensaste en consultar los documentos? – Marcin

Respuesta

13

re.match se match the string at the beginning, en contraste con re.search:

re.match(r'(ftp|http)://.*\.(jpg|png)$', s) 

Dos cosas a destacar aquí:

  • r'' se utiliza para la cadena literal para que sea trivial tener barras invertidas dentro de la expresión regular
  • string es un módulo estándar, por lo que optaron por s como una variable
  • Si utiliza una expresión regular más de una vez, puede utilizar r = re.compile(...) de construir la máquina de estado una vez y luego utilizar r.match(s) después para coincidir con las cadenas

Si lo desea, también puede utilizar el módulo urlparse a analizar la URL para usted (aunque todavía se necesita para extraer la extensión):

>>> allowed_schemes = ('http', 'ftp') 
>>> allowed_exts = ('png', 'jpg') 
>>> from urlparse import urlparse 
>>> url = urlparse("ftp://www.somewhere.com/over/the/rainbow/image.jpg") 
>>> url.scheme in allowed_schemes 
True 
>>> url.path.rsplit('.', 1)[1] in allowed_exts 
True 
15

¿Qué tal no usar una expresión regular?

if string.startswith("ftp://") and string.endswith(".jpg"): 

¿No crees que se puede leer mejor?

También puede soportar múltiples opciones de inicio y final:

if (string.startswith(("ftp://", "http://")) and 
    string.endswith((".jpg", ".png"))): 
+0

Lo haría, pero es más complicado porque hay un número válido de secuencias de inicio y finalización. Si supiera cómo hacer este sencillo caso, podría hacerlo funcionar con la realidad más complicada. :) –

+1

@Google: también puede consultar varias cadenas, ver mi actualización. –

3

Trate

re.search(r'^ftp://.*\.jpg$' ,string) 

si desea una búsqueda de expresiones regulares. Tenga en cuenta que debe escapar del período porque tiene un significado especial en las expresiones regulares.

9

No seas codicioso, utilice ^ftp://(.*?)\.jpg$

2
import re 

s = "ftp://www.somewhere.com/over/the/rainbow/image.jpg" 
print(re.search("^ftp://.*\.jpg$", s).group(0)) 
Cuestiones relacionadas