Mapa de posición de la cadena al número de línea en la salida de expresiones regulares

StackOverflow https://stackoverflow.com/questions/1522510

  •  19-09-2019
  •  | 
  •  

Pregunta

Estoy trabajando en una utilidad "grep-como" en Python para buscar archivos de código fuente de Oracle. los estándares de codificación han cambiado con el tiempo, por lo que tratar de encontrar algo así como "todos Borra de a.foo mesa" podría abarcar varias líneas, o no, en función de la edad de ese trozo de código:

s = """-- multiline DDL statement
DELETE
    a.foo f
WHERE
    f.bar = 'XYZ';

DELETE a.foo f
WHERE f.bar = 'ABC';

DELETE a.foo WHERE bar = 'PDQ';
"""

import re

p = re.compile( r'\bDELETE\b.+?a\.foo', re.MULTILINE | re.DOTALL )

for m in re.finditer( p, s ):
    print s[ m.start() : m.end() ]

Esto da salida:

DELETE
    a.foo
DELETE a.foo
DELETE a.foo

Lo que quiero:

[2] DELETE
[3]     a.foo
[7] DELETE a.foo
[10] DELETE a.foo

¿Hay una manera rápida / sencillo / orden interna para asignar índices de cadena a los números de línea?

¿Fue útil?

Solución

lineno = s.count("\n",0,m.start())+1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top