如何用Polars的str.replace_all正则替换路径列特定逗号为连字符?
问题分析与解决
你的正则写法问题在于:[a-z]\](,)\s会匹配数据块末尾的小写字母+],再加上后面的逗号和空格(比如Phone的最后一个字母e加上], ,整个片段是e], ),当你用-替换整个匹配内容时,就会把e], 直接换成-,导致原数据块变成[1, Phon-,自然达不到预期效果。
两种正确的解决方法
方法1:用反向预查精准定位分隔符
通过反向肯定预查,只匹配紧跟在]后面的, ,替换为-即可:
import polars as pl # 构造示例数据 s = pl.Series('path', ['[1, Phone], [2, Tablet], [3, Tablet], [4, Phone], [5, Phone], [6, Phone]']) df = pl.DataFrame(s) # 执行替换 result_df = df.with_columns(pl.col('path').str.replace_all(r'(?<=]), ', '-')) # 查看结果 print(result_df['path'][0]) # 输出:[1, Phone]-[2, Tablet]-[3, Tablet]-[4, Phone]-[5, Phone]-[6, Phone]
- 正则说明:
(?<=])是反向肯定预查,它会检查当前位置的前一个字符是],但不会把]纳入匹配内容,所以我们只替换目标分隔符,,不会改动原数据块的内容。
方法2:直接匹配块间完整分隔符替换
更直观的方式是直接匹配两个数据块之间的], ,替换为]-:
result_df = df.with_columns(pl.col('path').str.replace_all(r'], ', '-'))
- 逻辑说明:原数据块的分隔是
], [xxx],把],换成]-后,就变成]-[xxx],正好符合你要的[xxx]-[xxx]格式。
内容的提问来源于stack exchange,提问作者nam0_0
相关产品推荐
相关产品推荐

