2011-09-09 13 views
5

Si tengo una cadena grande con varias líneas y quiero hacer coincidir parte de una línea solo con el final de esa línea, ¿cuál es la mejor manera? ¿Para hacer eso?hacer coincidir parte de una cadena hasta que llegue al final de la línea (python regex)

Así que, por ejemplo, tengo algo como esto y quiero que deje de coincidir cuando llegue al nuevo carácter de línea.

r"(?P<name>[A-Za-z\s.]+)" 

vi esto en un previous answer:

$ - Indica a juego con el final de la cadena, o al final de una línea si se habilita multilínea.

Mi pregunta es, entonces, ¿cómo "habilita multilínea" como dice el autor de esa respuesta?

Respuesta

8

Utilice simplemente

r"(?P<name>[A-Za-z\t .]+)" 

Esto coinciden con las letras ASCII, espacios, tabulaciones o períodos. Se detendrá en el primer carácter que no está incluido en el grupo, y las líneas nuevas no (mientras que son incluidas en \s, y por eso es irrelevante si el modo multilínea se activa o desactiva).

1
+0

Esto no es útil: habilitar el modo multilínea no resolverá su problema. –

+0

Acabo de responder a su pregunta sobre cómo habilitar multilínea ... – rocksportrocker

+1

Correcto, y si alguien le pregunta si debe sostener su martillo hacia arriba o hacia abajo para apretar un tornillo, no le diría que use un destornillador en su lugar :) –

2

Puede activar el juego de líneas múltiples al pasar re.MULTILINE como segundo argumento a re.compile(). Sin embargo, hay una sutileza a tener en cuenta: dado que el cuantificador + es codicioso, esta expresión regular coincidirá con una cadena lo más larga posible, de modo que si la siguiente línea está compuesta de letras y espacios en blanco, la expresión regular puede coincidir con más de uno línea ($ coincide con el final de cualquier cadena).

Hay tres soluciones a este:

  1. cambiar su expresión regular de modo que, en lugar de hacer coincidir cualquier espacio en blanco incluyendo nueva línea (\s) el conjunto de caracteres repetidos no coincide con la nueva línea.
  2. Cambiar el cuantificador a +?, la versión de + no expansivo ("mínimo"), por lo que va a coincidir con una cadena lo más corta posible y por lo tanto parar en la primera nueva línea.
  3. cambiar su código para dividir primero el texto hacia arriba en una cadena individual para cada línea (usando text.split('\n').
+0

Gracias para las soluciones! El primero parece el más fácil de implementar. ¿Sabe específicamente cómo puedo especificar que solo quiero que coincidan espacios únicos en lugar de espacios en blanco? Probé la segunda solución pero solo coincide con un solo personaje. –

+1

Lo malo, debería haberlo mencionado, para todas estas soluciones, también debe incluir el ancla '$' (final de cadena) al final.De esta forma, con la solución 2, 're' encontrará la cadena más corta que coincida con la expresión regular * y * hasta el final de una línea, que es lo que desea. Para la solución 1, se puede representar un espacio en un juego de caracteres por un espacio literal, sin escapatoria requerida (es decir, '[A-Za-z.]') – azernik

Cuestiones relacionadas