2008-10-08 14 views
16

¿Cuál es la expresión regular para hacer coincidir cadenas (en este caso, nombres de archivo) que comienzan con 'Ejecutar' y tienen una extensión de nombre de archivo '.py'?Expresión regular para unir el inicio del nombre de archivo y la extensión de nombre de archivo

La expresión regular debe coincidir con cualquiera de los siguientes:

RunFoo.py 
RunBar.py 
Run42.py 

No debe coincidir:

myRunFoo.py 
RunBar.py1 
Run42.txt 

El SQL equivalente de lo que estoy buscando es ... LIKE 'Run%.py' ....

Respuesta

32

Para una expresión regular, se debería utilizar:

re.match(r'Run.*\.py$') 

Un explicación rápida:

  • . significa coincidir con cualquier personaje.
  • * significa coincide con ninguna repetición del carácter anterior (de aquí. * Significa cualquier secuencia de caracteres)
  • \ es una vía de escape para escapar del punto explícita
  • $ indica "final de la cadena", por lo que don' t coincide con "Run_foo.py.txt"

Sin embargo, para esta tarea, probablemente sea mejor utilizar métodos de cadena simples. es decir.

filename.startswith("Run") and filename.endswith(".py") 

Nota: si quieres de mayúsculas y minúsculas (es decir, a juego "run.PY", así como "Run.py", utilice la opción re.I a la expresión regular, o convertir a un caso concreto (. por ejemplo filename.lower()) antes de usar métodos de cadena

+2

1. no es necesario especificar el inicio de la línea para la coincidencia de expresión regular de python? 2. * es cero o más coincidencias (es decir, por lo que Run.py sería aceptable) –

+0

Además, ¿cómo lo haría insensible a las mayúsculas y minúsculas? –

+0

re.match ya especifica el inicio de la cadena (a diferencia de re.search, que no lo hace). "Run.py" * debe * coincidir, dada la definición (comienza con Ejecutar y tiene una extensión .py). Para la insensibilidad de mayúsculas y minúsculas, consulte la nota al final. – Brian

0

Esto probablemente no cumple plenamente con las normas de nomenclatura de archivos, pero aquí va:

/^Run[\w]*?\.py$/ 
+0

se parece a una solución de Perl para una pregunta etiquetado pitón ... pero no soy un experto en Python: p y como Jobscry señaló, su solución distingue entre mayúsculas y minúsculas. –

+0

* err ha señalado a Rob Howard que es –

+0

. No debería usar. *, En lugar de \ w - la puntuación y el espacio en blanco, etc., probablemente todavía deberían considerarse parte del nombre del archivo. por ejemplo, "Run.foo.py" – Brian

6
/^Run.*\.py$/ 

O, en pitón específicamente:

import re 
re.match(r"^Run.*\.py$", stringtocheck) 

Esto corresponderá con "Runfoobar .py ", pero no" runfoobar.PY ". Para que sea más sensible a mayúsculas, en lugar de usar:

re.match(r"^Run.*\.py$", stringtocheck, re.I) 
0

mabye:

^Run.*\.py$ 

sólo un rápido tratan

+0

¿Necesita. *, en lugar de.? (que solo coincidirá con un solo carácter) – Brian

+0

doh, gracias Brian – imjoevasquez

14

Advertencia:.

  • respuesta de jobscry ("?.^py $ Run") es incorrecta (no coincidirá con "Run123.py", por ejemplo).
  • La respuesta de orlandu63 ("/^Run[\w]*??py$/") no coincidirá con "RunFoo.Bar.py".

(No tengo suficiente reputación para comentar, lo siento.)

+0

Le conseguiremos esos puntos de rep. :) –

+1

Cripes, eso fue rápido. Gracias. :-) –

2

Si se escribe una expresión regular un poco más compleja, se puede obtener una característica adicional: extraer el bit entre "Run" y ".py":

>>> import re 
>>> regex = '^Run(?P<name>.*)\.py$' 
>>> m = re.match(regex, 'RunFoo.py') 
>>> m.group('name') 
'Foo' 

(el bit adicional es el paréntesis y todo entre ellos, excepto por '. *' que es como en la respuesta de Rob Howard)

12

Realmente no entiendo por qué buscas una expresión regular para resolver este 'problema'. Estás buscando una forma de encontrar todos los archivos .py que comienzan con 'Ejecutar'. Así que esta es una solución simple que va a funcionar, sin recurrir a la compilación de un funcionamiento de una expresión regular:

import os 
for filename in os.listdir(dirname): 
    root, ext = os.path.splitext(filename) 
    if root.startswith('Run') and ext == '.py': 
     print filename 
4

que no es necesario una expresión regular, puede utilizar pegote, que tiene comodines, por ejemplo, Ejecutar * .py

Por ejemplo, para conseguir esos archivos en el directorio actual ...

import os, glob 
files = glob.glob("".join([ os.getcwd(), "\\Run*.py"])) 
Cuestiones relacionadas