9
9
is_string_like ,
10
10
is_list_like ,
11
11
is_scalar ,
12
- is_integer )
12
+ is_integer ,
13
+ is_re )
13
14
from pandas .core .common import _values_from_object
14
15
15
16
from pandas .core .algorithms import take_1d
@@ -303,16 +304,20 @@ def str_endswith(arr, pat, na=np.nan):
303
304
return _na_map (f , arr , na , dtype = bool )
304
305
305
306
306
- def str_replace (arr , pat , repl , n = - 1 , case = True , flags = 0 ):
307
+ def str_replace (arr , pat , repl , n = - 1 , case = None , flags = 0 ):
307
308
"""
308
309
Replace occurrences of pattern/regex in the Series/Index with
309
310
some other string. Equivalent to :meth:`str.replace` or
310
311
:func:`re.sub`.
311
312
312
313
Parameters
313
314
----------
314
- pat : string
315
- Character sequence or regular expression
315
+ pat : string or compiled regex
316
+ String can be a character sequence or regular expression.
317
+
318
+ .. versionadded:: 0.20.0
319
+ `pat` also accepts a compiled regex.
320
+
316
321
repl : string or callable
317
322
Replacement string or a callable. The callable is passed the regex
318
323
match object and must return a replacement string to be used.
@@ -323,15 +328,24 @@ def str_replace(arr, pat, repl, n=-1, case=True, flags=0):
323
328
324
329
n : int, default -1 (all)
325
330
Number of replacements to make from start
326
- case : boolean, default True
327
- If True, case sensitive
331
+ case : boolean, default None
332
+ - If True, case sensitive
333
+ - Must be None if `pat` is a compiled regex
334
+ - Defaults to True if `pat` is a string
328
335
flags : int, default 0 (no flags)
329
- re module flags, e.g. re.IGNORECASE
336
+ - re module flags, e.g. re.IGNORECASE
337
+ - Must be 0 if `pat` is a compiled regex
330
338
331
339
Returns
332
340
-------
333
341
replaced : Series/Index of objects
334
342
343
+ Notes
344
+ -----
345
+ When `pat` is a compiled regex, all flags should be included in the
346
+ compiled regex. Use of `case` or `flags` with a compiled regex will
347
+ raise an error.
348
+
335
349
Examples
336
350
--------
337
351
When `repl` is a string, every `pat` is replaced as with
@@ -372,21 +386,42 @@ def str_replace(arr, pat, repl, n=-1, case=True, flags=0):
372
386
0 tWO
373
387
1 bAR
374
388
dtype: object
389
+
390
+ Using a compiled regex with flags
391
+
392
+ >>> regex_pat = re.compile(r'FUZ', flags=re.IGNORECASE)
393
+ >>> pd.Series(['foo', 'fuz', np.nan]).str.replace(regex_pat, 'bar')
394
+ 0 foo
395
+ 1 bar
396
+ 2 NaN
397
+ dtype: object
375
398
"""
376
399
377
400
# Check whether repl is valid (GH 13438, GH 15055)
378
401
if not (is_string_like (repl ) or callable (repl )):
379
402
raise TypeError ("repl must be a string or callable" )
380
- use_re = not case or len (pat ) > 1 or flags or callable (repl )
381
403
382
- if use_re :
383
- if not case :
404
+ is_compiled_re = is_re (pat )
405
+ if is_compiled_re :
406
+ if (case is not None ) or (flags != 0 ):
407
+ raise ValueError ("case and flags must be default values"
408
+ " when pat is a compiled regex" )
409
+ else :
410
+ # not a compiled regex
411
+ # set default case
412
+ if case is None :
413
+ case = True
414
+
415
+ # add case flag, if provided
416
+ if case is False :
384
417
flags |= re .IGNORECASE
385
- regex = re .compile (pat , flags = flags )
386
- n = n if n >= 0 else 0
387
418
388
- def f (x ):
389
- return regex .sub (repl , x , count = n )
419
+ use_re = is_compiled_re or len (pat ) > 1 or flags or callable (repl )
420
+
421
+ if use_re :
422
+ n = n if n >= 0 else 0
423
+ f = lambda x : re .sub (pattern = pat , repl = repl , string = x ,
424
+ count = n , flags = flags )
390
425
else :
391
426
f = lambda x : x .replace (pat , repl , n )
392
427
@@ -1558,7 +1593,7 @@ def match(self, pat, case=True, flags=0, na=np.nan, as_indexer=False):
1558
1593
return self ._wrap_result (result )
1559
1594
1560
1595
@copy (str_replace )
1561
- def replace (self , pat , repl , n = - 1 , case = True , flags = 0 ):
1596
+ def replace (self , pat , repl , n = - 1 , case = None , flags = 0 ):
1562
1597
result = str_replace (self ._data , pat , repl , n = n , case = case ,
1563
1598
flags = flags )
1564
1599
return self ._wrap_result (result )
0 commit comments