提问人:Alejandro Simkievich 提问时间:3/30/2016 最后编辑:smciAlejandro Simkievich 更新时间:12/22/2021 访问量:3147
避免使用正则表达式 pandas str.replace
Avoid pandas str.replace using a regex
问:
我有以下熊猫数据帧。假设它有两列:和:id
search_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 表示任何字符。inl
in.
ine
in.
如何重写第一个命令,以便从字面上替换为,但任何未后跟点的命令保持不变,如下所示:in.
in.
in
a = 'inline switch'
a = a.replace('in.','in. ')
a
>>> 'inline switch'
答:
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
评论