You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
re module doesn't describe string boundaries for \b #54922
The re module defines \b in a regexp to need \w one side and \W the other. What about when the end of the string or line is involved? perlre(1) says that's treated as a \W. Python should precisely document that case too.
Examining the source of Ubuntu's python2.6 2.6.6-5ubuntu1 package
suggests beyond the limits of the string is considered \W, like Perl.
[Modules/_sre.c](https://github.com/python/cpython/blob/main/Modules/_sre.c):
336 LOCAL(int)
337 SRE_AT(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at)
338 {
339 /* check if pointer is at given position */
340
341 Py_ssize_t thisp, thatp;
...
365 case SRE_AT_BOUNDARY:
366 if (state->beginning == state->end)
367 return 0;
368 thatp = ((void*) ptr > state->beginning) ?
369 SRE_IS_WORD((int) ptr[-1]) : 0;
370 thisp = ((void*) ptr < state->end) ?
371 SRE_IS_WORD((int) ptr[0]) : 0;
372 return thisp != thatp;
SRE_IS_WORD() returns 16 for the 63 \w characters, 0 otherwise.
This is born out by tests.
Note, 366 above confirms it's never true for an empty string. The
documentation states that \B "is just the opposite of \b" yet
re.match(r'\b', '') returns None and so does \B so \B isn't the opposite
of \b in all cases.
poolie commented on Aug 22, 2011
pooliemannequin
Mannequin
More actions
Note, 366 above confirms it's never true for an empty string. The
documentation states that \B "is just the opposite of \b" yet
re.match(r'\b', '') returns None and so does \B so \B isn't the opposite
of \b in all cases.
This is also a bit strange if you follow the Perl line of reasoning of imagining there are non-word characters outside the string. And, indeed, in Perl,
"" =~ /\B/
is true.
So this patch adds some tests for \b behaviour and some docs. I think possible \B should actually change, but that would be a bigger (perhaps impossible?) change.
This is a new patch based on Martin work.
I don't think it's necessary to explain what happens while using r'\b' or r'\B' on an empty string in the doc -- that's not a common case and it might end up confusing users. I think however that a couple of examples might help them figuring out what they are useful for.
Mentioning that they work with the beginning/end of the string too is a reasonable request, so I tweaked the doc to point that out.
Activity
ralphcorderoy commentedon Dec 16, 2010
The re module defines \b in a regexp to need \w one side and \W the other. What about when the end of the string or line is involved? perlre(1) says that's treated as a \W. Python should precisely document that case too.
merwok commentedon May 7, 2011
Thanks for the report. Would you be interested in experimenting and/or reading the code to find the anwser and propose a doc patch?
ralphcorderoy commentedon May 8, 2011
Examining the source of Ubuntu's python2.6 2.6.6-5ubuntu1 package
suggests beyond the limits of the string is considered \W, like Perl.
SRE_IS_WORD() returns 16 for the 63 \w characters, 0 otherwise.
This is born out by tests.
Note, 366 above confirms it's never true for an empty string. The
documentation states that \B "is just the opposite of \b" yet
re.match(r'\b', '') returns None and so does \B so \B isn't the opposite
of \b in all cases.
poolie commentedon Aug 22, 2011
This is also a bit strange if you follow the Perl line of reasoning of imagining there are non-word characters outside the string. And, indeed, in Perl,
"" =~ /\B/
is true.
So this patch adds some tests for \b behaviour and some docs. I think possible \B should actually change, but that would be a bigger (perhaps impossible?) change.
ezio-melotti commentedon Feb 27, 2012
This is a new patch based on Martin work.
I don't think it's necessary to explain what happens while using r'\b' or r'\B' on an empty string in the doc -- that's not a common case and it might end up confusing users. I think however that a couple of examples might help them figuring out what they are useful for.
Mentioning that they work with the beginning/end of the string too is a reasonable request, so I tweaked the doc to point that out.
merwok commentedon Feb 27, 2012
Like it.
python-dev commentedon Feb 29, 2012
New changeset fc89e09ca2fc by Ezio Melotti in branch '2.7':
bpo-10713: Improve documentation for \b and \B and add a few tests. Initial patch and tests by Martin Pool.
http://hg.python.org/cpython/rev/fc89e09ca2fc
New changeset cde7fa40b289 by Ezio Melotti in branch '3.2':
bpo-10713: Improve documentation for \b and \B and add a few tests. Initial patch and tests by Martin Pool.
http://hg.python.org/cpython/rev/cde7fa40b289
New changeset b78ca038e468 by Ezio Melotti in branch 'default':
bpo-10713: merge with 3.2.
http://hg.python.org/cpython/rev/b78ca038e468
ezio-melotti commentedon Feb 29, 2012
Fixed, thanks for the patch!