@@ -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
@@ -1016,7 +1017,7 @@ def test_replace_callable(self):
1016
1017
1017
1018
# test with callable
1018
1019
repl = lambda m : m .group (0 ).swapcase ()
1019
- result = values .str .replace ('[a-z][A-Z]{2}' , repl , n = 2 )
1020
+ result = values .str .replace ('[a-z][A-Z]{2}' , repl , n = 2 , regex = True )
1020
1021
exp = Series (['foObaD__baRbaD' , NA ])
1021
1022
tm .assert_series_equal (result , exp )
1022
1023
@@ -1029,21 +1030,21 @@ def test_replace_callable(self):
1029
1030
1030
1031
repl = lambda : None
1031
1032
with pytest .raises (TypeError , match = p_err ):
1032
- values .str .replace ('a' , repl )
1033
+ values .str .replace ('a' , repl , regex = True )
1033
1034
1034
1035
repl = lambda m , x : None
1035
1036
with pytest .raises (TypeError , match = p_err ):
1036
- values .str .replace ('a' , repl )
1037
+ values .str .replace ('a' , repl , regex = True )
1037
1038
1038
1039
repl = lambda m , x , y = None : None
1039
1040
with pytest .raises (TypeError , match = p_err ):
1040
- values .str .replace ('a' , repl )
1041
+ values .str .replace ('a' , repl , regex = True )
1041
1042
1042
1043
# test regex named groups
1043
1044
values = Series (['Foo Bar Baz' , NA ])
1044
1045
pat = r"(?P<first>\w+) (?P<middle>\w+) (?P<last>\w+)"
1045
1046
repl = lambda m : m .group ('middle' ).swapcase ()
1046
- result = values .str .replace (pat , repl )
1047
+ result = values .str .replace (pat , repl , regex = True )
1047
1048
exp = Series (['bAR' , NA ])
1048
1049
tm .assert_series_equal (result , exp )
1049
1050
@@ -1053,35 +1054,35 @@ def test_replace_compiled_regex(self):
1053
1054
1054
1055
# test with compiled regex
1055
1056
pat = re .compile (r'BAD[_]*' )
1056
- result = values .str .replace (pat , '' )
1057
+ result = values .str .replace (pat , '' , regex = True )
1057
1058
exp = Series (['foobar' , NA ])
1058
1059
tm .assert_series_equal (result , exp )
1059
1060
1060
1061
# mixed
1061
1062
mixed = Series (['aBAD' , NA , 'bBAD' , True , datetime .today (), 'fooBAD' ,
1062
1063
None , 1 , 2. ])
1063
1064
1064
- rs = Series (mixed ).str .replace (pat , '' )
1065
+ rs = Series (mixed ).str .replace (pat , '' , regex = True )
1065
1066
xp = Series (['a' , NA , 'b' , NA , NA , 'foo' , NA , NA , NA ])
1066
1067
assert isinstance (rs , Series )
1067
1068
tm .assert_almost_equal (rs , xp )
1068
1069
1069
1070
# unicode
1070
1071
values = Series ([u ('fooBAD__barBAD' ), NA ])
1071
1072
1072
- result = values .str .replace (pat , '' )
1073
+ result = values .str .replace (pat , '' , regex = True )
1073
1074
exp = Series ([u ('foobar' ), NA ])
1074
1075
tm .assert_series_equal (result , exp )
1075
1076
1076
- result = values .str .replace (pat , '' , n = 1 )
1077
+ result = values .str .replace (pat , '' , n = 1 , regex = True )
1077
1078
exp = Series ([u ('foobarBAD' ), NA ])
1078
1079
tm .assert_series_equal (result , exp )
1079
1080
1080
1081
# flags + unicode
1081
1082
values = Series ([b"abcd,\xc3 \xa0 " .decode ("utf-8" )])
1082
1083
exp = Series ([b"abcd, \xc3 \xa0 " .decode ("utf-8" )])
1083
1084
pat = re .compile (r"(?<=\w),(?=\w)" , flags = re .UNICODE )
1084
- result = values .str .replace (pat , ", " )
1085
+ result = values .str .replace (pat , ", " , regex = True )
1085
1086
tm .assert_series_equal (result , exp )
1086
1087
1087
1088
# case and flags provided to str.replace will have no effect
@@ -1091,29 +1092,30 @@ def test_replace_compiled_regex(self):
1091
1092
1092
1093
with pytest .raises (ValueError ,
1093
1094
match = "case and flags cannot be" ):
1094
- result = values .str .replace (pat , '' , flags = re .IGNORECASE )
1095
+ result = values .str .replace (pat , '' , flags = re .IGNORECASE ,
1096
+ regex = True )
1095
1097
1096
1098
with pytest .raises (ValueError ,
1097
1099
match = "case and flags cannot be" ):
1098
- result = values .str .replace (pat , '' , case = False )
1100
+ result = values .str .replace (pat , '' , case = False , regex = True )
1099
1101
1100
1102
with pytest .raises (ValueError ,
1101
1103
match = "case and flags cannot be" ):
1102
- result = values .str .replace (pat , '' , case = True )
1104
+ result = values .str .replace (pat , '' , case = True , regex = True )
1103
1105
1104
1106
# test with callable
1105
1107
values = Series (['fooBAD__barBAD' , NA ])
1106
1108
repl = lambda m : m .group (0 ).swapcase ()
1107
1109
pat = re .compile ('[a-z][A-Z]{2}' )
1108
- result = values .str .replace (pat , repl , n = 2 )
1110
+ result = values .str .replace (pat , repl , n = 2 , regex = True )
1109
1111
exp = Series (['foObaD__baRbaD' , NA ])
1110
1112
tm .assert_series_equal (result , exp )
1111
1113
1112
1114
def test_replace_literal (self ):
1113
1115
# GH16808 literal replace (regex=False vs regex=True)
1114
1116
values = Series (['f.o' , 'foo' , NA ])
1115
1117
exp = Series (['bao' , 'bao' , NA ])
1116
- result = values .str .replace ('f.' , 'ba' )
1118
+ result = values .str .replace ('f.' , 'ba' , regex = True )
1117
1119
tm .assert_series_equal (result , exp )
1118
1120
1119
1121
exp = Series (['bao' , 'foo' , NA ])
@@ -2923,6 +2925,7 @@ def test_partition_deprecation(self):
2923
2925
result = values .str .rpartition (pat = '_' )
2924
2926
tm .assert_frame_equal (result , expected )
2925
2927
2928
+ @pytest .mark .filterwarnings ("ignore: '|' is interpreted as a literal" )
2926
2929
def test_pipe_failures (self ):
2927
2930
# #2119
2928
2931
s = Series (['A|B|C' ])
@@ -2932,7 +2935,7 @@ def test_pipe_failures(self):
2932
2935
2933
2936
tm .assert_series_equal (result , exp )
2934
2937
2935
- result = s .str .replace ('|' , ' ' )
2938
+ result = s .str .replace ('|' , ' ' , regex = None )
2936
2939
exp = Series (['A B C' ])
2937
2940
2938
2941
tm .assert_series_equal (result , exp )
@@ -3244,17 +3247,17 @@ def test_replace_moar(self):
3244
3247
s = Series (['A' , 'B' , 'C' , 'Aaba' , 'Baca' , '' , NA , 'CABA' ,
3245
3248
'dog' , 'cat' ])
3246
3249
3247
- result = s .str .replace ('A' , 'YYY' )
3250
+ result = s .str .replace ('A' , 'YYY' , regex = True )
3248
3251
expected = Series (['YYY' , 'B' , 'C' , 'YYYaba' , 'Baca' , '' , NA ,
3249
3252
'CYYYBYYY' , 'dog' , 'cat' ])
3250
3253
assert_series_equal (result , expected )
3251
3254
3252
- result = s .str .replace ('A' , 'YYY' , case = False )
3255
+ result = s .str .replace ('A' , 'YYY' , case = False , regex = True )
3253
3256
expected = Series (['YYY' , 'B' , 'C' , 'YYYYYYbYYY' , 'BYYYcYYY' , '' , NA ,
3254
3257
'CYYYBYYY' , 'dog' , 'cYYYt' ])
3255
3258
assert_series_equal (result , expected )
3256
3259
3257
- result = s .str .replace ('^.a|dog' , 'XX-XX ' , case = False )
3260
+ result = s .str .replace ('^.a|dog' , 'XX-XX ' , case = False , regex = True )
3258
3261
expected = Series (['A' , 'B' , 'C' , 'XX-XX ba' , 'XX-XX ca' , '' , NA ,
3259
3262
'XX-XX BA' , 'XX-XX ' , 'XX-XX t' ])
3260
3263
assert_series_equal (result , expected )
@@ -3441,11 +3444,44 @@ def test_method_on_bytes(self):
3441
3444
['ad' , 'be' , 'cf' ], 'S2' ).astype (object ))
3442
3445
tm .assert_series_equal (result , expected )
3443
3446
3447
+ @pytest .mark .filterwarnings ("ignore: '.' is interpreted as a literal" )
3448
+ @pytest .mark .parametrize ("regex, expected_array" , [
3449
+ (True , ['foofoofoo' , 'foofoofoo' ]),
3450
+ (False , ['abc' , '123' ]),
3451
+ (None , ['abc' , '123' ])
3452
+ ])
3453
+ def test_replace_single_pattern (self , regex , expected_array ):
3454
+ values = Series (['abc' , '123' ])
3455
+ # GH: 24804
3456
+ result = values .str .replace ('.' , 'foo' , regex = regex )
3457
+ expected = Series (expected_array )
3458
+ tm .assert_series_equal (result , expected )
3459
+
3460
+ @pytest .mark .parametrize ("input_array, single_char, replace_char, "
3461
+ "expect_array, warn" ,
3462
+ [("a.c" , "." , "b" , "abc" , True ),
3463
+ ("a@c" , "@" , "at" , "aatc" , False )]
3464
+ )
3465
+ def test_replace_warning_single_character (self , input_array ,
3466
+ single_char , replace_char ,
3467
+ expect_array , warn ):
3468
+ # GH: 24804
3469
+ values = Series ([input_array ])
3470
+ if warn :
3471
+ with tm .assert_produces_warning (FutureWarning ,
3472
+ check_stacklevel = False ):
3473
+ result = values .str .replace (single_char , replace_char )
3474
+ else :
3475
+ result = values .str .replace (single_char , replace_char )
3476
+
3477
+ expected = Series ([expect_array ])
3478
+ == == == =
3444
3479
@pytest .mark .skipif (compat .PY2 , reason = 'not in python2' )
3445
3480
def test_casefold (self ):
3446
3481
# GH25405
3447
3482
expected = Series (['ss' , NA , 'case' , 'ssd' ])
3448
3483
s = Series (['ß' , NA , 'case' , 'ßd' ])
3449
3484
result = s .str .casefold ()
3450
3485
3486
+ >> >> >> > github / master
3451
3487
tm .assert_series_equal (result , expected )
0 commit comments