避免使用正则表达式 pandas str.replace

Avoid pandas str.replace using a regex

提问人:Alejandro Simkievich 提问时间:3/30/2016 最后编辑:smciAlejandro Simkievich 更新时间:12/22/2021 访问量:3147

问:

我有以下熊猫数据帧。假设它有两列:和:idsearch_term

id       search_term
37651    inline switch

我愿意:

train['search_term'] = train['search_term'].str.replace("in."," in. ")

期望上面的数据集不受影响,但我得到这个数据集的回报:

id       search_term
37651    in.  in.  switch

which means 被 和 替换为 ,就好像 i 使用正则表达式一样,其中 dot 表示任何字符。inlin.inein.

如何重写第一个命令,以便从字面上替换为,但任何未后跟点的命令保持不变,如下所示:in.in.in

a = 'inline switch'
a = a.replace('in.','in. ')

a
>>> 'inline switch'
python 正则表达式 字符串 pandas 替换

评论

0赞 Joe T. Boka 3/30/2016
您实际期望的输出是多少?
0赞 Alejandro Simkievich 3/30/2016
对不起,我想从字面上替换“点”。我在下面发布了一个答案,因为我发现了一篇关于“点”正则表达式的好文章。问题是 DataFrame 中的 str.replace() 使用正则表达式

答:

2赞 Alejandro Simkievich 3/30/2016 #1

答案是:正则表达式来匹配一个点。

pandas 中的 str.replace() 确实使用了正则表达式,因此:

df['a'] = df['a'].str.replace('in.', ' in. ')

无法与:

a.replace('in.', ' in. ')

后者不使用正则表达式。因此,在使用正则表达式的语句中使用“\.”而不是“.”,如果你真的指的是点而不是任何字符。

用于匹配点的正则表达式

评论

0赞 Ami Tavory 3/30/2016
但请注意,您仍然可以使用正则表达式,同时声明点没有特殊含义。
1赞 Ami Tavory 3/30/2016 #2

尝试转义:.

import pandas as pd

df = pd.DataFrame({'search_term': ['inline switch', 'in.here']})
>>> df.search_term.str.replace('in\\.', 'in. ')
0    inline switch
1          in. here
Name: search_term, dtype: object

评论

0赞 Alejandro Simkievich 3/30/2016
谢谢阿米。我看到你逃脱了.在第一个论点中,那么第二个论点呢?如果你想从字面上用'in.'代替'in.'。' 然后你应该使用 str.replace('in\\.', 'in\\.') 或 str.replace('in\\.', 'in.')?
0赞 Ami Tavory 3/30/2016
@AlejandroSimkievich 这似乎是合乎逻辑的,但不是。请参阅上面的更新示例。只有第一个字符串中的点被解释为正则表达式字符(必须转义)。
5赞 daisukelab 9/5/2019 #3

版本 0.23 或更高版本,获得了切换正则表达式的新选项。 关注将简单地将其关闭。str.replace()

df.search_term.str.replace('in.', 'in. ', regex=False)

将导致:

0    inline switch
1         in. here
Name: search_term, dtype: object