Lele Gaifax wrote:

> Peter Otten <__pete...@web.de> writes:
>> Lele Gaifax wrote:
>>> The original intent is to replace spaces within a string with the
>>> regular expression \s+ (see
>>> ...
>>> Accordingly to the documentation
>>> (https://docs.python.org/3.6/library/re.html#re.sub) “unknown escapes
>>> [in the repl argument] such as \& are left alone”.
>> According to
>> https://docs.python.org/dev/library/re.html#re.sub
>> rejection of \s is intentional
>> """
>> Changed in version 3.6: Unknown escapes consisting of '\' and an ASCII
>> letter now are errors.
>> """
> So, how am I supposed to achieve the mentioned intent? By doubling the
> escape in the replacement?

If there are no escape sequences aimed to be handled by re.sub() you can 
escape the replacement wholesale:

>>> re.sub(r'\s+', re.escape(r'\s+'), 'foo bar')

OK, that probably escaped too much. Second attempt:

>>> re.sub(r'\s+', lambda m: r'\s+', 'foo bar')

Better? If that's too much work at runtime:

>>> def double_bs(s): return "\\\\".join(s.split("\\"))
>>> re.sub(r'\s+', double_bs(r'\s+'), 'foo bar')

>> though IMHO the traceback needs a cleanup.
> And the documentation as well, to clarify the fact immediately, without
> assuming one will scroll down to the "changed in version" part (at least,
> that is what seem the rule in other parts of the manual).
> Thank you,
> ciao, lele.


Reply via email to