2009-10-05 8 views
3

Je travaille sur un utilitaire "grep-like" en Python pour la recherche de fichiers de code source Oracle. les normes de codage ont changé au fil du temps, afin d'essayer de trouver quelque chose comme « de la table tout supprime a.foo » pourrait couvrir plusieurs lignes, ou non, en fonction de l'âge de ce morceau de code:position de chaîne de la carte à numéro de ligne dans la sortie regex

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() ] 

Cette sortie:

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

Ce que je veux:

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

est-il un moyen rapide/simple,/bUILTIN carte des indices de chaîne pour les numéros de ligne?

Répondre

6
lineno = s.count("\n",0,m.start())+1 
+0

Merci, vous bercez! – kurosch

+0

Que faire si vous êtes sur un système différent ou que vous ne savez pas sur quel système d'exploitation vous êtes? Il pourrait être soit \ n \ f \ f soit une combinaison de ceux-ci. – sebs

+1

Vous pouvez toujours utiliser os.linesep comme décrit ici http://stackoverflow.com/questions/454725/python-get-proper-line-ending#454809 –

Questions connexes