On Feb 12, 8:30 pm, MRAB <pyt...@mrabarnett.plus.com> wrote: > McColgst wrote: > > On Feb 12, 2:39 pm, Martin <mdeka...@gmail.com> wrote: > >> Hi, > > >> I am trying to come up with a more generic scheme to match and replace > >> a series of regex, which look something like this... > > >> 19.01,16.38,0.79,1.26,1.00 ! canht_ft(1:npft) > >> 5.0, 4.0, 2.0, 4.0, 1.0 ! lai(1:npft) > > >> Ideally match the pattern to the right of the "!" sign (e.g. lai), I > >> would then like to be able to replace one or all of the corresponding > >> numbers on the line. So far I have a rather unsatisfactory solution, > >> any suggestions would be appreciated... > > >> The file read in is an ascii file. > > >> f = open(fname, 'r') > >> s = f.read() > > >> if CANHT: > >> s = re.sub(r"\d+.\d+,\d+.\d+,\d+.\d+,\d+.\d+,\d+.\d+ ! > >> canht_ft", CANHT, s) > > >> where CANHT might be > > >> CANHT = '115.01,16.38,0.79,1.26,1.00 ! canht_ft' > > >> But this involves me passing the entire string. > > >> Thanks. > > >> Martin > > > If I understand correctly, there are a couple ways to do it. > > One is to use .split() and split by the '!' sign, given that you wont > > have more than one '!' on a line. This will return a list of the words > > split by the delimiter, in this case being '!', so you should get back > > (19.01,16.38,0.79,1.26,1.00 , canht_ft(1:npft) ) and you can do > > whatever replace functions you want using the list. > > > check out split:http://docs.python.org/library/stdtypes.html#str.split > > The .split method is the best way if you process the file a line at a > time. The .split method, incidentally, accepts a maxcount argument so > that you can split a line no more than once. > > > Another, is in your regular expression, you can match the first part > > or second part of the string by specifying where the '!' is, > > if you want to match the part after the '!' I would do something like > > r"[^! cahnt_ft]", or something similar (i'm not particularly up-to- > > date with my regex syntax, but I think you get the idea.) > > The regex would be r"(?m)^[^!]*(!.*)" to capture the '!' and the rest of > the line. > > > > > I hope I understood correctly, and I hope that helps.
I guess I could read the file a line at a time and try splitting it, though I though it would be better to read it all once then search for the various regex I need to match and replace? I am not sure that regex helps, as that would match and replace every line which had a "!". Perhaps if i explain more thoroughly? So the input file looks something like this... 9*0.0 ! canopy(1:ntiles) 12.100 ! cs 0.0 ! gs 9*50.0 ! rgrain(1:ntiles) 0.749, 0.743, 0.754, 0.759 ! stheta(1:sm_levels)(top to bottom) 9*0.46 ! snow_tile(1:ntiles) 0.46 ! snow_grnd 276.78,277.46,278.99,282.48 ! t_soil(1:sm_levels)(top to bottom) 9*276.78 ! tstar_tile(1:ntiles) 19.01,16.38,0.79,1.26,1.00 ! canht_ft(1:npft) 200.0, 4.0, 2.0, 4.0, 1.0 ! lai(1:npft) So for each of the strings following the "!" I may potentially want to match them and replace some of the numbers. That is I might search for the expression snow_grnd with the intention of substituting 0.46 for another number. What i came up with was a way to match all the numbers and pass the replacement string. -- http://mail.python.org/mailman/listinfo/python-list