re.search - just skip it

Kent Johnson kent3737 at yahoo.com
Wed Jan 26 11:21:40 EST 2005


rasdj at frontiernet.net wrote:
> Input is this:
> 
> SET1_S_W CHAR(1) NOT NULL,
> SET2_S_W CHAR(1) NOT NULL,
> SET3_S_W CHAR(1) NOT NULL,
> SET4_S_W CHAR(1) NOT NULL,
> ;
> 
> .py says:
> 
> import re, string, sys
> s_ora = re.compile('.*S_W.*')
> lines = open("y.sql").readlines()
> for i in range(len(lines)):
> try:
> if s_ora.search(lines[i]): del lines[i]

When you delete for example lines[0], the indices of the following lines change. So the former 
lines[1] is now lines[0] and will not be checked.

The simplest way to do this is with a list comprehension:
lines = [ line for line in lines if not s_ora.search(line) ]

Even better, there is no need to make the intermediate list of all lines, you can say
lines = [ line for line in open("y.sql") if not s_ora.search(line) ]

In Python 2.4 you don't have to make a list at all, you can just say
open("z.sql","w").writelines(line for line in open("y.sql") if not s_ora.search(line))

;)

Kent

> except IndexError:
> open("z.sql","w").writelines(lines)
> 
> but output is:
> 
> SET2_S_W CHAR(1) NOT NULL,
> SET4_S_W CHAR(1) NOT NULL,
> ;
> 
> It should delete every, not every other!
> 
> thx,
> 
> RasDJ
> 



More information about the Python-list mailing list