[Python-Dev] Zero-width matching in regexes
MRAB
python at mrabarnett.plus.com
Tue Dec 5 19:17:12 EST 2017
On 2017-12-05 20:26, Terry Reedy wrote:
> On 12/4/2017 6:21 PM, MRAB wrote:
>> I've finally come to a conclusion as to what the "correct" behaviour of
>> zero-width matches should be: """always return the first match, but
>> never a zero-width match that is joined to a previous zero-width match""".
>
> Is this different from current re or regex?
>
Sometimes yes.
It's difficult to know how a zero-width match should be handled.
The normal way that, say, findall works is that it searches for a match
and then continues from where it left off.
If at any point it matched an empty string, it would stall because the
end of the match is also the start of the match.
How should that be handled?
The old buggy behaviour of the re module was to just advance by one
character after a zero-width match, which can result in a character
being skipped and going missing.
A solution is to prohibit a zero-width match that's joined to the
previous match, but I'm not convinced that that's correct.
>> If it's about to return a zero-width match that's joined to a previous
>> zero-width match, then backtrack and keep on looking for a match.
>>
>> Example:
>>
>> >>> print([m.span() for m in re.finditer(r'|.', 'a')])
>> [(0, 0), (0, 1), (1, 1)]
>>
>> re.findall, re.split and re.sub should work accordingly.
>>
>> If re.finditer finds n matches, then re.split should return a list of
>> n+1 strings and re.sub should make n replacements (excepting maxsplit,
>> etc.).
>
More information about the Python-Dev
mailing list