ignored for empty strings.
(Contributed by Victor Stinner in :issue:`37388`.)
+* ``"".replace("", s, n)`` now returns ``s`` instead of an empty string for
+ all non-zero ``n``. It is now consistent with ``"".replace("", s)``.
+ There are similar changes for :class:`bytes` and :class:`bytearray` objects.
+ (Contributed by Serhiy Storchaka in :issue:`28029`.)
+
New Modules
===========
EQ("", "", "replace", "A", "")
EQ("", "", "replace", "A", "A")
EQ("", "", "replace", "", "", 100)
+ EQ("A", "", "replace", "", "A", 100)
EQ("", "", "replace", "", "", sys.maxsize)
# interleave (from=="", 'to' gets inserted everywhere)
--- /dev/null
+``"".replace("", s, n)`` now returns ``s`` instead of an empty string for
+all non-zero ``n``. There are similar changes for :class:`bytes` and
+:class:`bytearray` objects.
const char *to_s, Py_ssize_t to_len,
Py_ssize_t maxcount)
{
+ if (STRINGLIB_LEN(self) < from_len) {
+ /* nothing to do; return the original bytes */
+ return return_self(self);
+ }
if (maxcount < 0) {
maxcount = PY_SSIZE_T_MAX;
- } else if (maxcount == 0 || STRINGLIB_LEN(self) == 0) {
+ } else if (maxcount == 0) {
/* nothing to do; return the original bytes */
return return_self(self);
}
return stringlib_replace_interleave(self, to_s, to_len, maxcount);
}
- /* Except for b"".replace(b"", b"A") == b"A" there is no way beyond this */
- /* point for an empty self bytes to generate a non-empty bytes */
- /* Special case so the remaining code always gets a non-empty bytes */
- if (STRINGLIB_LEN(self) == 0) {
- return return_self(self);
- }
-
if (to_len == 0) {
/* delete all occurrences of 'from' bytes */
if (from_len == 1) {
int mayshrink;
Py_UCS4 maxchar, maxchar_str1, maxchar_str2;
+ if (slen < len1)
+ goto nothing;
+
if (maxcount < 0)
maxcount = PY_SSIZE_T_MAX;
- else if (maxcount == 0 || slen == 0)
+ else if (maxcount == 0)
goto nothing;
if (str1 == str2)