2009-10-05 53 views
3

我正在研究Python中用於搜索Oracle源代碼文件的「grep-like」實用程序。編碼標準隨時間而變化,所以試圖找到一些像「一切從表a.foo刪除」可以跨越多行,還是不行,這取決於這段代碼的年齡:將字符串位置映射到正則表達式輸出中的行號

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

此輸出:

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

我想要什麼:

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

是否有一個快速/簡單/內置的方法來映射字符串的索引行號?

回答

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

謝謝,你搖滾! – kurosch 2009-10-05 21:55:10

+0

如果你在不同的系統上,或者你不知道你在使用哪個操作系統,該怎麼辦?它可以是\ n \ r \ f或這些的組合。 – sebs 2011-11-09 04:45:49

+1

您可以隨時使用os.linesep,如http://stackoverflow.com/questions/454725/python-get-proper-line-ending#454809 – 2012-01-29 14:20:54

相關問題