@@ -967,38 +967,39 @@ def test_casemethods(self):
967
967
def test_replace (self ):
968
968
values = Series (['fooBAD__barBAD' , NA ])
969
969
970
- result = values .str .replace ('BAD[_]*' , '' )
970
+ result = values .str .replace ('BAD[_]*' , '' , regex = True )
971
971
exp = Series (['foobar' , NA ])
972
972
tm .assert_series_equal (result , exp )
973
973
974
- result = values .str .replace ('BAD[_]*' , '' , n = 1 )
974
+ result = values .str .replace ('BAD[_]*' , '' , regex = True , n = 1 )
975
975
exp = Series (['foobarBAD' , NA ])
976
976
tm .assert_series_equal (result , exp )
977
977
978
978
# mixed
979
979
mixed = Series (['aBAD' , NA , 'bBAD' , True , datetime .today (), 'fooBAD' ,
980
980
None , 1 , 2. ])
981
981
982
- rs = Series (mixed ).str .replace ('BAD[_]*' , '' )
982
+ rs = Series (mixed ).str .replace ('BAD[_]*' , '' , regex = True )
983
983
xp = Series (['a' , NA , 'b' , NA , NA , 'foo' , NA , NA , NA ])
984
984
assert isinstance (rs , Series )
985
985
tm .assert_almost_equal (rs , xp )
986
986
987
987
# unicode
988
988
values = Series ([u ('fooBAD__barBAD' ), NA ])
989
989
990
- result = values .str .replace ('BAD[_]*' , '' )
990
+ result = values .str .replace ('BAD[_]*' , '' , regex = True )
991
991
exp = Series ([u ('foobar' ), NA ])
992
992
tm .assert_series_equal (result , exp )
993
993
994
- result = values .str .replace ('BAD[_]*' , '' , n = 1 )
994
+ result = values .str .replace ('BAD[_]*' , '' , n = 1 , regex = True )
995
995
exp = Series ([u ('foobarBAD' ), NA ])
996
996
tm .assert_series_equal (result , exp )
997
997
998
998
# flags + unicode
999
999
values = Series ([b"abcd,\xc3 \xa0 " .decode ("utf-8" )])
1000
1000
exp = Series ([b"abcd, \xc3 \xa0 " .decode ("utf-8" )])
1001
- result = values .str .replace (r"(?<=\w),(?=\w)" , ", " , flags = re .UNICODE )
1001
+ result = values .str .replace (r"(?<=\w),(?=\w)" , ", " , regex = True ,
1002
+ flags = re .UNICODE )
1002
1003
tm .assert_series_equal (result , exp )
1003
1004
1004
1005
# GH 13438
@@ -1014,7 +1015,7 @@ def test_replace_callable(self):
1014
1015
1015
1016
# test with callable
1016
1017
repl = lambda m : m .group (0 ).swapcase ()
1017
- result = values .str .replace ('[a-z][A-Z]{2}' , repl , n = 2 )
1018
+ result = values .str .replace ('[a-z][A-Z]{2}' , repl , n = 2 , regex = True )
1018
1019
exp = Series (['foObaD__baRbaD' , NA ])
1019
1020
tm .assert_series_equal (result , exp )
1020
1021
@@ -1027,21 +1028,21 @@ def test_replace_callable(self):
1027
1028
1028
1029
repl = lambda : None
1029
1030
with pytest .raises (TypeError , match = p_err ):
1030
- values .str .replace ('a' , repl )
1031
+ values .str .replace ('a' , repl , regex = True )
1031
1032
1032
1033
repl = lambda m , x : None
1033
1034
with pytest .raises (TypeError , match = p_err ):
1034
- values .str .replace ('a' , repl )
1035
+ values .str .replace ('a' , repl , regex = True )
1035
1036
1036
1037
repl = lambda m , x , y = None : None
1037
1038
with pytest .raises (TypeError , match = p_err ):
1038
- values .str .replace ('a' , repl )
1039
+ values .str .replace ('a' , repl , regex = True )
1039
1040
1040
1041
# test regex named groups
1041
1042
values = Series (['Foo Bar Baz' , NA ])
1042
1043
pat = r"(?P<first>\w+) (?P<middle>\w+) (?P<last>\w+)"
1043
1044
repl = lambda m : m .group ('middle' ).swapcase ()
1044
- result = values .str .replace (pat , repl )
1045
+ result = values .str .replace (pat , repl , regex = True )
1045
1046
exp = Series (['bAR' , NA ])
1046
1047
tm .assert_series_equal (result , exp )
1047
1048
@@ -1051,35 +1052,35 @@ def test_replace_compiled_regex(self):
1051
1052
1052
1053
# test with compiled regex
1053
1054
pat = re .compile (r'BAD[_]*' )
1054
- result = values .str .replace (pat , '' )
1055
+ result = values .str .replace (pat , '' , regex = True )
1055
1056
exp = Series (['foobar' , NA ])
1056
1057
tm .assert_series_equal (result , exp )
1057
1058
1058
1059
# mixed
1059
1060
mixed = Series (['aBAD' , NA , 'bBAD' , True , datetime .today (), 'fooBAD' ,
1060
1061
None , 1 , 2. ])
1061
1062
1062
- rs = Series (mixed ).str .replace (pat , '' )
1063
+ rs = Series (mixed ).str .replace (pat , '' , regex = True )
1063
1064
xp = Series (['a' , NA , 'b' , NA , NA , 'foo' , NA , NA , NA ])
1064
1065
assert isinstance (rs , Series )
1065
1066
tm .assert_almost_equal (rs , xp )
1066
1067
1067
1068
# unicode
1068
1069
values = Series ([u ('fooBAD__barBAD' ), NA ])
1069
1070
1070
- result = values .str .replace (pat , '' )
1071
+ result = values .str .replace (pat , '' , regex = True )
1071
1072
exp = Series ([u ('foobar' ), NA ])
1072
1073
tm .assert_series_equal (result , exp )
1073
1074
1074
- result = values .str .replace (pat , '' , n = 1 )
1075
+ result = values .str .replace (pat , '' , n = 1 , regex = True )
1075
1076
exp = Series ([u ('foobarBAD' ), NA ])
1076
1077
tm .assert_series_equal (result , exp )
1077
1078
1078
1079
# flags + unicode
1079
1080
values = Series ([b"abcd,\xc3 \xa0 " .decode ("utf-8" )])
1080
1081
exp = Series ([b"abcd, \xc3 \xa0 " .decode ("utf-8" )])
1081
1082
pat = re .compile (r"(?<=\w),(?=\w)" , flags = re .UNICODE )
1082
- result = values .str .replace (pat , ", " )
1083
+ result = values .str .replace (pat , ", " , regex = True )
1083
1084
tm .assert_series_equal (result , exp )
1084
1085
1085
1086
# case and flags provided to str.replace will have no effect
@@ -1089,29 +1090,30 @@ def test_replace_compiled_regex(self):
1089
1090
1090
1091
with pytest .raises (ValueError ,
1091
1092
match = "case and flags cannot be" ):
1092
- result = values .str .replace (pat , '' , flags = re .IGNORECASE )
1093
+ result = values .str .replace (pat , '' , flags = re .IGNORECASE ,
1094
+ regex = True )
1093
1095
1094
1096
with pytest .raises (ValueError ,
1095
1097
match = "case and flags cannot be" ):
1096
- result = values .str .replace (pat , '' , case = False )
1098
+ result = values .str .replace (pat , '' , case = False , regex = True )
1097
1099
1098
1100
with pytest .raises (ValueError ,
1099
1101
match = "case and flags cannot be" ):
1100
- result = values .str .replace (pat , '' , case = True )
1102
+ result = values .str .replace (pat , '' , case = True , regex = True )
1101
1103
1102
1104
# test with callable
1103
1105
values = Series (['fooBAD__barBAD' , NA ])
1104
1106
repl = lambda m : m .group (0 ).swapcase ()
1105
1107
pat = re .compile ('[a-z][A-Z]{2}' )
1106
- result = values .str .replace (pat , repl , n = 2 )
1108
+ result = values .str .replace (pat , repl , n = 2 , regex = True )
1107
1109
exp = Series (['foObaD__baRbaD' , NA ])
1108
1110
tm .assert_series_equal (result , exp )
1109
1111
1110
1112
def test_replace_literal (self ):
1111
1113
# GH16808 literal replace (regex=False vs regex=True)
1112
1114
values = Series (['f.o' , 'foo' , NA ])
1113
1115
exp = Series (['bao' , 'bao' , NA ])
1114
- result = values .str .replace ('f.' , 'ba' )
1116
+ result = values .str .replace ('f.' , 'ba' , regex = True )
1115
1117
tm .assert_series_equal (result , exp )
1116
1118
1117
1119
exp = Series (['bao' , 'foo' , NA ])
@@ -2915,6 +2917,7 @@ def test_partition_deprecation(self):
2915
2917
result = values .str .rpartition (pat = '_' )
2916
2918
tm .assert_frame_equal (result , expected )
2917
2919
2920
+ @pytest .mark .filterwarnings ("ignore: '|' is interpreted as a literal" )
2918
2921
def test_pipe_failures (self ):
2919
2922
# #2119
2920
2923
s = Series (['A|B|C' ])
@@ -2924,7 +2927,7 @@ def test_pipe_failures(self):
2924
2927
2925
2928
tm .assert_series_equal (result , exp )
2926
2929
2927
- result = s .str .replace ('|' , ' ' )
2930
+ result = s .str .replace ('|' , ' ' , regex = None )
2928
2931
exp = Series (['A B C' ])
2929
2932
2930
2933
tm .assert_series_equal (result , exp )
@@ -3236,17 +3239,17 @@ def test_replace_moar(self):
3236
3239
s = Series (['A' , 'B' , 'C' , 'Aaba' , 'Baca' , '' , NA , 'CABA' ,
3237
3240
'dog' , 'cat' ])
3238
3241
3239
- result = s .str .replace ('A' , 'YYY' )
3242
+ result = s .str .replace ('A' , 'YYY' , regex = True )
3240
3243
expected = Series (['YYY' , 'B' , 'C' , 'YYYaba' , 'Baca' , '' , NA ,
3241
3244
'CYYYBYYY' , 'dog' , 'cat' ])
3242
3245
assert_series_equal (result , expected )
3243
3246
3244
- result = s .str .replace ('A' , 'YYY' , case = False )
3247
+ result = s .str .replace ('A' , 'YYY' , case = False , regex = True )
3245
3248
expected = Series (['YYY' , 'B' , 'C' , 'YYYYYYbYYY' , 'BYYYcYYY' , '' , NA ,
3246
3249
'CYYYBYYY' , 'dog' , 'cYYYt' ])
3247
3250
assert_series_equal (result , expected )
3248
3251
3249
- result = s .str .replace ('^.a|dog' , 'XX-XX ' , case = False )
3252
+ result = s .str .replace ('^.a|dog' , 'XX-XX ' , case = False , regex = True )
3250
3253
expected = Series (['A' , 'B' , 'C' , 'XX-XX ba' , 'XX-XX ca' , '' , NA ,
3251
3254
'XX-XX BA' , 'XX-XX ' , 'XX-XX t' ])
3252
3255
assert_series_equal (result , expected )
@@ -3424,3 +3427,36 @@ def test_method_on_bytes(self):
3424
3427
expected = Series (np .array (
3425
3428
['ad' , 'be' , 'cf' ], 'S2' ).astype (object ))
3426
3429
tm .assert_series_equal (result , expected )
3430
+
3431
+ @pytest .mark .filterwarnings ("ignore: '.' is interpreted as a literal" )
3432
+ @pytest .mark .parametrize ("regex, expected_array" , [
3433
+ (True , ['foofoofoo' , 'foofoofoo' ]),
3434
+ (False , ['abc' , '123' ]),
3435
+ (None , ['abc' , '123' ])
3436
+ ])
3437
+ def test_replace_single_pattern (self , regex , expected_array ):
3438
+ values = Series (['abc' , '123' ])
3439
+ # GH: 24804
3440
+ result = values .str .replace ('.' , 'foo' , regex = regex )
3441
+ expected = Series (expected_array )
3442
+ tm .assert_series_equal (result , expected )
3443
+
3444
+ @pytest .mark .parametrize ("input_array, single_char, replace_char, "
3445
+ "expect_array, warn" ,
3446
+ [("a.c" , "." , "b" , "abc" , True ),
3447
+ ("a@c" , "@" , "at" , "aatc" , False )]
3448
+ )
3449
+ def test_replace_warning_single_character (self , input_array ,
3450
+ single_char , replace_char ,
3451
+ expect_array , warn ):
3452
+ # GH: 24804
3453
+ values = Series ([input_array ])
3454
+ if warn :
3455
+ with tm .assert_produces_warning (FutureWarning ,
3456
+ check_stacklevel = False ):
3457
+ result = values .str .replace (single_char , replace_char )
3458
+ else :
3459
+ result = values .str .replace (single_char , replace_char )
3460
+
3461
+ expected = Series ([expect_array ])
3462
+ tm .assert_series_equal (result , expected )
0 commit comments