Polars str.replace 把 $$ 原样留下,换个正则又正常
Polars 2.0 的纯文字模式优化可能漏掉替换值中的美元符展开。2.1.0 已补齐这条路径;区分正则替换与 literal=True,不对所有替换值重复转义。
str.replace("USD", "$$") 本想得到一个美元符,结果留下两个;把模式换成 "USD|EUR" 后又只剩一个。若使用 Polars 2.0,应检查纯文字模式的优化路径,而不是继续给替换值叠加转义符。
正则替换中的 $ 用于捕获组展开,$$ 表示一个字面美元符。2.0 对不含正则标点的模式走了文字替换优化,却漏做替换值展开;复杂正则走另一条路径,两者便出现差异。这个现象不等于所有 $ 都应写成 $$,要先看是否启用了 literal 模式。
两种意图应写成不同配置
如果只是把固定文字 USD 换成一个 $,无需正则捕获组,可以明确使用纯文字替换:
import polars as pl
result = frame.with_columns(
pl.col("currency_text").str.replace_all("USD", "$", literal=True)
)
此时替换值就是一个美元符,不应再写成 "$$"。示例替换全部匹配;原逻辑只需要第一次匹配时,应继续使用 replace,不要为避错改变替换次数。
需要正则与捕获组时,则保留正则语义,并使用包含修正的正式版本。2.1.0 已为纯文字模式优化补上替换展开,能把 $$ 按正则替换规则处理。升级后应保留原模式和替换表达式核对,不用加一个无意义的 | 强迫走另一条内部路径。
不把所有反斜杠和美元符一起改掉
Python 字符串转义、正则模式语法和替换值展开是三层规则。原始字符串前缀 r 不会关闭替换值中的美元符含义;literal=True 则会改变模式与替换处理,不适合需要捕获组的表达式。
本题中,"USD" 本来就是纯文字,literal 模式可以保持匹配范围。若模式是 "USD|EUR"、含字符类或分组,改成 literal 会转而寻找这些字符本身,不能直接套用同一规避。
2.0 的部分 n=0 路径还存在行为不一致的情况。如果业务约定零次替换,应在调用入口直接保留原表达式,不要借这次美元符修正顺带假设所有替换次数边界都已解决。
验收覆盖固定文字模式、真正的正则、捕获组引用、字面美元符,以及列中本来已有的 $。对照替换次数与未匹配文本;不要只看不再出现两个美元符,就忽略捕获组内容已经消失。保留原文本,错误转换后仅凭输出可能无法分清哪两个美元符原本就存在。


