Python+pandas正则匹配列特定格式值替换x为0及报错解决
报错原因
- 未做匹配结果空判断:当列内值不符合正则规则时,
re.search()返回None,直接调用.group()就会触发'NoneType' object has no attribute 'group'错误。 - 函数名不一致:定义的处理函数名为
convert_format_x,但apply调用时传入的是不存在的convert_constraint,本身也会抛名称错误。 - 正则兼容性不足:原正则没有考虑示例值里的前后空格、比较运算符和数字之间的空格,会漏匹配符合业务规则的取值。
- 函数无返回值:就算匹配成功,原函数没有写return逻辑,拿不到处理后的结果。
- 单列apply多余参数:对pandas单列Series调用
apply时不需要传axis=1,该参数仅针对DataFrame多列处理场景。
替换实现代码
直接用正则替换逻辑即可,不需要单独提取分组,同时兼容空格场景、对非匹配值原样返回,从根源避免空报错:
import re # 正则规则说明:匹配 可选空格+大于/大于等于符号+可选空格+数字.数字. 前缀,捕获前缀后把末尾的x替换为0 x_replace_pattern = re.compile(r"(\s*[>=]+\s*\d+\.\d+\.)x") def replace_x_with_zero(value): # 过滤非字符串类型值,避免类型报错 if not isinstance(value, str): return value # 匹配到规则就替换,没匹配到直接返回原值 return x_replace_pattern.sub(r"\10", value) # 单列调用apply不需要加axis参数 testing = testdata["column_4"].apply(replace_x_with_zero)
效果验证
- 输入
" >=3.1.x ",输出:" >=3.1.0 " - 输入
" >=9.5.x ",输出:" >=9.5.0 " - 输入非目标格式值(如
"v1.0.2"、123、None),会原样返回,无报错。
内容的提问来源于stack exchange,提问作者Em_Rose
相关产品推荐
相关产品推荐

