Pandas中如何同时使用字典与正则表达式实现字符串替换
解决方案
可以直接使用pandas.Series.str.replace的回调函数参数实现需求,匹配到符合规则的内容后直接查询替换字典返回对应值即可,完整实现代码如下:
import pandas as pd # 示例数据 column = pd.Series(['01-01', '01-01 qwerasdf 0101-0101', '01-02 test', 'a01-02b', '101-02']) # 批量替换字典 replace_dict = {'01-01': '0101', '01-02': '0102'} # 执行替换 column = column.str.replace( pat=r'(?<!\d)(\d{2}\-\d{2})(?!\d)', repl=lambda match: replace_dict.get(match.group(1), match.group(1)), regex=True )
代码说明
pat参数沿用你原来的正则规则,仅匹配前后无数字的xx-xx格式内容repl参数传入匿名回调函数,每次匹配到内容时会将匹配对象传入函数:- 用
match.group(1)取出匹配到的xx-xx内容 - 调用
replace_dict.get查询替换值,如果匹配到的内容不在字典中,就返回原内容避免报错
- 用
- 执行完成后输出结果如下,符合需求:
0 0101 1 0101 qwerasdf 0101-0101 2 0102 test 3 a0102b 4 101-02 dtype: object
替代方案(适配旧版本pandas)
如果你的pandas版本低于1.2,不支持repl传入回调函数,可先导入re模块,构造带正则锚点的替换字典再调用replace方法:
import re # 构造带前后校验的正则替换字典 regex_replace_dict = { rf'(?<!\d){re.escape(k)}(?!\d)': v for k, v in replace_dict.items() } # 执行替换 column = column.replace(regex_replace_dict, regex=True)
内容的提问来源于stack exchange,提问作者k07224115
相关产品推荐
相关产品推荐

