You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python正则表达式问题:提取px数值计算后替换原字符串

问题分析

你的脚本之所以丢失了最后的"yummy cake",是因为re.findall('.*?px', my_string)只抓取了所有以px结尾的片段,那些不包含px的内容直接被忽略了。而且逐个替换拼接的方式不仅繁琐,还容易出现遗漏或重复替换的问题。

更简洁高效的解决方案

其实Python的re.sub()支持传入一个回调函数作为替换参数,这样我们可以在每次匹配到目标内容时,动态计算并返回新值,同时自动保留原字符串中所有未匹配的部分。

下面是实现你需求的完整代码:

import re

def process_px_value(match):
    # 从匹配结果中提取数值部分
    original_num = float(match.group(1))
    # 计算新值
    new_num = original_num * 2.5
    # 处理小数位数:如果是整数就转成整数格式,否则保留小数
    return str(int(new_num)) if new_num.is_integer() else str(new_num)

my_string = "2px aperture 12px science 2.1px yummy cake"
result = re.sub(r"([0-9.]+)px", process_px_value, my_string)
print(result)  # 输出: 5 aperture 30 science 5.25 yummy cake

代码说明

  1. 正则表达式r"([0-9.]+)px":捕获所有带px单位的数值,其中([0-9.]+)是捕获组,用来提取纯数字(包括小数)。
  2. 回调函数process_px_value:接收match对象,通过match.group(1)获取捕获到的数值,计算后返回格式化后的字符串(避免出现5.0这种不必要的小数)。
  3. re.sub()会遍历整个字符串,对每一个匹配项调用回调函数替换,同时自动保留所有未匹配的文本(比如"aperture"、"yummy cake")。

扩展用法(可选)

如果你之后想保留px或者换成其他单位(比如em),只需要修改回调函数的返回值即可:

  • 保留px:return f"{new_num}px"
  • 换成em:return f"{new_num}em"

内容的提问来源于stack exchange,提问作者Arkeen

火山引擎 最新活动