On 2026-08-09, Veek M <[email protected]> wrote: > look-ahead look-behind don't consume string so how does it advance through > the string - could someone clearly explain how it works. > > re.sub(r'((?<=\A)|(?<=,))(?=,|\Z)', 'NA', ',1,,,two,3,,,') > 'NA,1,NA,NA,two,3,NA,NA,NA'
It's matching the empty string. It'll advance because once it's matched at a certain position, the regular expression matcher will advance the start position to the end of that match before checking for another match. > re.sub(r'(?<![^,])(?![^,])', 'NA', ',1,,,two,3,,,') > 'NA,1,NA,NA,two,3,NA,NA,NA' That's not doing differently to what the above expression doesn't not do. It's trying to get around the limitation of lookbehind assertions that every pattern they could match must be of the same fixed length, by replacing "prior to the match must be the start of the string, or prior to the match must be a comma" with "prior to the match must not be a character that is not a comma". > My understanding is that there has to be a pattern that consumes the > string eg: here [^,] consumes two 3 four and 5 but the look-ahead look- > behind eliminate 5 > > re.findall(r'(?<=,)[^,]+(?=,)', '1,two,3,four,5') > ['two', '3', 'four'] > > If it's matching the empty string '' then why don't we get NA,NA1 etc > for ,1 Because the empty string in-between the "," and the "1" fails the lookahead assertion that after the match must be a comma or the end of the string (or must not be a character that is not a comma, in the second version). -- https://mail.python.org/mailman3//lists/python-list.python.org
