@@ -967,38 +967,39 @@ def test_casemethods(self):
967967 def test_replace (self ):
968968 values = Series (['fooBAD__barBAD' , NA ])
969969
970- result = values .str .replace ('BAD[_]*' , '' )
970+ result = values .str .replace ('BAD[_]*' , '' , regex = True )
971971 exp = Series (['foobar' , NA ])
972972 tm .assert_series_equal (result , exp )
973973
974- result = values .str .replace ('BAD[_]*' , '' , n = 1 )
974+ result = values .str .replace ('BAD[_]*' , '' , regex = True , n = 1 )
975975 exp = Series (['foobarBAD' , NA ])
976976 tm .assert_series_equal (result , exp )
977977
978978 # mixed
979979 mixed = Series (['aBAD' , NA , 'bBAD' , True , datetime .today (), 'fooBAD' ,
980980 None , 1 , 2. ])
981981
982- rs = Series (mixed ).str .replace ('BAD[_]*' , '' )
982+ rs = Series (mixed ).str .replace ('BAD[_]*' , '' , regex = True )
983983 xp = Series (['a' , NA , 'b' , NA , NA , 'foo' , NA , NA , NA ])
984984 assert isinstance (rs , Series )
985985 tm .assert_almost_equal (rs , xp )
986986
987987 # unicode
988988 values = Series ([u ('fooBAD__barBAD' ), NA ])
989989
990- result = values .str .replace ('BAD[_]*' , '' )
990+ result = values .str .replace ('BAD[_]*' , '' , regex = True )
991991 exp = Series ([u ('foobar' ), NA ])
992992 tm .assert_series_equal (result , exp )
993993
994- result = values .str .replace ('BAD[_]*' , '' , n = 1 )
994+ result = values .str .replace ('BAD[_]*' , '' , n = 1 , regex = True )
995995 exp = Series ([u ('foobarBAD' ), NA ])
996996 tm .assert_series_equal (result , exp )
997997
998998 # flags + unicode
999999 values = Series ([b"abcd,\xc3 \xa0 " .decode ("utf-8" )])
10001000 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 )
10021003 tm .assert_series_equal (result , exp )
10031004
10041005 # GH 13438
@@ -1014,7 +1015,7 @@ def test_replace_callable(self):
10141015
10151016 # test with callable
10161017 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 )
10181019 exp = Series (['foObaD__baRbaD' , NA ])
10191020 tm .assert_series_equal (result , exp )
10201021
@@ -1027,21 +1028,21 @@ def test_replace_callable(self):
10271028
10281029 repl = lambda : None
10291030 with pytest .raises (TypeError , match = p_err ):
1030- values .str .replace ('a' , repl )
1031+ values .str .replace ('a' , repl , regex = True )
10311032
10321033 repl = lambda m , x : None
10331034 with pytest .raises (TypeError , match = p_err ):
1034- values .str .replace ('a' , repl )
1035+ values .str .replace ('a' , repl , regex = True )
10351036
10361037 repl = lambda m , x , y = None : None
10371038 with pytest .raises (TypeError , match = p_err ):
1038- values .str .replace ('a' , repl )
1039+ values .str .replace ('a' , repl , regex = True )
10391040
10401041 # test regex named groups
10411042 values = Series (['Foo Bar Baz' , NA ])
10421043 pat = r"(?P<first>\w+) (?P<middle>\w+) (?P<last>\w+)"
10431044 repl = lambda m : m .group ('middle' ).swapcase ()
1044- result = values .str .replace (pat , repl )
1045+ result = values .str .replace (pat , repl , regex = True )
10451046 exp = Series (['bAR' , NA ])
10461047 tm .assert_series_equal (result , exp )
10471048
@@ -1051,35 +1052,35 @@ def test_replace_compiled_regex(self):
10511052
10521053 # test with compiled regex
10531054 pat = re .compile (r'BAD[_]*' )
1054- result = values .str .replace (pat , '' )
1055+ result = values .str .replace (pat , '' , regex = True )
10551056 exp = Series (['foobar' , NA ])
10561057 tm .assert_series_equal (result , exp )
10571058
10581059 # mixed
10591060 mixed = Series (['aBAD' , NA , 'bBAD' , True , datetime .today (), 'fooBAD' ,
10601061 None , 1 , 2. ])
10611062
1062- rs = Series (mixed ).str .replace (pat , '' )
1063+ rs = Series (mixed ).str .replace (pat , '' , regex = True )
10631064 xp = Series (['a' , NA , 'b' , NA , NA , 'foo' , NA , NA , NA ])
10641065 assert isinstance (rs , Series )
10651066 tm .assert_almost_equal (rs , xp )
10661067
10671068 # unicode
10681069 values = Series ([u ('fooBAD__barBAD' ), NA ])
10691070
1070- result = values .str .replace (pat , '' )
1071+ result = values .str .replace (pat , '' , regex = True )
10711072 exp = Series ([u ('foobar' ), NA ])
10721073 tm .assert_series_equal (result , exp )
10731074
1074- result = values .str .replace (pat , '' , n = 1 )
1075+ result = values .str .replace (pat , '' , n = 1 , regex = True )
10751076 exp = Series ([u ('foobarBAD' ), NA ])
10761077 tm .assert_series_equal (result , exp )
10771078
10781079 # flags + unicode
10791080 values = Series ([b"abcd,\xc3 \xa0 " .decode ("utf-8" )])
10801081 exp = Series ([b"abcd, \xc3 \xa0 " .decode ("utf-8" )])
10811082 pat = re .compile (r"(?<=\w),(?=\w)" , flags = re .UNICODE )
1082- result = values .str .replace (pat , ", " )
1083+ result = values .str .replace (pat , ", " , regex = True )
10831084 tm .assert_series_equal (result , exp )
10841085
10851086 # case and flags provided to str.replace will have no effect
@@ -1089,29 +1090,30 @@ def test_replace_compiled_regex(self):
10891090
10901091 with pytest .raises (ValueError ,
10911092 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 )
10931095
10941096 with pytest .raises (ValueError ,
10951097 match = "case and flags cannot be" ):
1096- result = values .str .replace (pat , '' , case = False )
1098+ result = values .str .replace (pat , '' , case = False , regex = True )
10971099
10981100 with pytest .raises (ValueError ,
10991101 match = "case and flags cannot be" ):
1100- result = values .str .replace (pat , '' , case = True )
1102+ result = values .str .replace (pat , '' , case = True , regex = True )
11011103
11021104 # test with callable
11031105 values = Series (['fooBAD__barBAD' , NA ])
11041106 repl = lambda m : m .group (0 ).swapcase ()
11051107 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 )
11071109 exp = Series (['foObaD__baRbaD' , NA ])
11081110 tm .assert_series_equal (result , exp )
11091111
11101112 def test_replace_literal (self ):
11111113 # GH16808 literal replace (regex=False vs regex=True)
11121114 values = Series (['f.o' , 'foo' , NA ])
11131115 exp = Series (['bao' , 'bao' , NA ])
1114- result = values .str .replace ('f.' , 'ba' )
1116+ result = values .str .replace ('f.' , 'ba' , regex = True )
11151117 tm .assert_series_equal (result , exp )
11161118
11171119 exp = Series (['bao' , 'foo' , NA ])
@@ -2915,6 +2917,7 @@ def test_partition_deprecation(self):
29152917 result = values .str .rpartition (pat = '_' )
29162918 tm .assert_frame_equal (result , expected )
29172919
2920+ @pytest .mark .filterwarnings ("ignore: '|' is interpreted as a literal" )
29182921 def test_pipe_failures (self ):
29192922 # #2119
29202923 s = Series (['A|B|C' ])
@@ -2924,7 +2927,7 @@ def test_pipe_failures(self):
29242927
29252928 tm .assert_series_equal (result , exp )
29262929
2927- result = s .str .replace ('|' , ' ' )
2930+ result = s .str .replace ('|' , ' ' , regex = None )
29282931 exp = Series (['A B C' ])
29292932
29302933 tm .assert_series_equal (result , exp )
@@ -3236,17 +3239,17 @@ def test_replace_moar(self):
32363239 s = Series (['A' , 'B' , 'C' , 'Aaba' , 'Baca' , '' , NA , 'CABA' ,
32373240 'dog' , 'cat' ])
32383241
3239- result = s .str .replace ('A' , 'YYY' )
3242+ result = s .str .replace ('A' , 'YYY' , regex = True )
32403243 expected = Series (['YYY' , 'B' , 'C' , 'YYYaba' , 'Baca' , '' , NA ,
32413244 'CYYYBYYY' , 'dog' , 'cat' ])
32423245 assert_series_equal (result , expected )
32433246
3244- result = s .str .replace ('A' , 'YYY' , case = False )
3247+ result = s .str .replace ('A' , 'YYY' , case = False , regex = True )
32453248 expected = Series (['YYY' , 'B' , 'C' , 'YYYYYYbYYY' , 'BYYYcYYY' , '' , NA ,
32463249 'CYYYBYYY' , 'dog' , 'cYYYt' ])
32473250 assert_series_equal (result , expected )
32483251
3249- result = s .str .replace ('^.a|dog' , 'XX-XX ' , case = False )
3252+ result = s .str .replace ('^.a|dog' , 'XX-XX ' , case = False , regex = True )
32503253 expected = Series (['A' , 'B' , 'C' , 'XX-XX ba' , 'XX-XX ca' , '' , NA ,
32513254 'XX-XX BA' , 'XX-XX ' , 'XX-XX t' ])
32523255 assert_series_equal (result , expected )
@@ -3424,3 +3427,36 @@ def test_method_on_bytes(self):
34243427 expected = Series (np .array (
34253428 ['ad' , 'be' , 'cf' ], 'S2' ).astype (object ))
34263429 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