V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
coolair
V2EX  ›  问与答

Python 将 rgb(54, 162, 235) 字符串转成 rgba(54, 162, 235, 0.5)该怎么写正则匹配?

  •  
  •   coolair · 2019-04-09 16:27:15 +08:00 · 2368 次点击
    这是一个创建于 2084 天前的主题,其中的信息可能已经有所发展或是发生改变。

    忽略 rgb 的大小写,并把 alpha 添加进去, 而且,后面可能有多个空格。

    感谢了,搞了一下午没搞出来。

    21 条回复    2019-04-10 18:12:02 +08:00
    1iuh
        1
    1iuh  
       2019-04-09 16:32:48 +08:00
    先吧 RGB 替换成 rgb,再把 rgb 替换为 rgba,再把 235 替换为 235,0.5 就可以了。 一定要用 python 搞么?
    jiutai21
        2
    jiutai21  
       2019-04-09 16:35:04 +08:00
    用邪道方法 evel,定义 rgb(r,g,b) 函数,然后执行
    1iuh
        3
    1iuh  
       2019-04-09 16:35:12 +08:00
    总之拆分一下再去实现就简单了。
    jiutai21
        4
    jiutai21  
       2019-04-09 16:36:19 +08:00   ❤️ 1
    def rgb(r,g,b):
    return 'rgba({},{},{},0.5)'.format(r,g,b)

    src = 'rgb(54,162,235)'

    a = eval(src)
    print(a)
    coolair
        5
    coolair  
    OP
       2019-04-09 16:36:56 +08:00
    @1iuh 额,很麻烦啊,关键是想写成通用的,rgb 可能是 Rgb,235 也可能是别的数字。实在是不太会正则。
    xmoiduts
        6
    xmoiduts  
       2019-04-09 16:38:07 +08:00 via Android
    搭车求问,长度为( 4*led 数量)的字符串,每个 led 用 4 字节存信息( rgbw ),可否使用正则或其他方法变成( grbw )?由于单片机性能十分有限,希望找到比 py 更快的方法。
    coolair
        7
    coolair  
    OP
       2019-04-09 16:38:51 +08:00
    @jiutai21 这样确实很邪啊,厉害!
    misaka19000
        8
    misaka19000  
       2019-04-09 16:42:03 +08:00
    replace(')', ', 0.5)') 这样不就可以了吗,要什么正则
    1iuh
        9
    1iuh  
       2019-04-09 16:45:09 +08:00
    @coolair #5 你最好用 gist 贴一部分片段出来, 我试试帮你解决一下。
    coolair
        10
    coolair  
    OP
       2019-04-09 16:45:53 +08:00
    @jiutai21 不过这样的话,alpha 就没办法作为一个变量传进去啊。
    cissoid
        11
    cissoid  
       2019-04-09 16:47:31 +08:00   ❤️ 1
    >>> re.sub(r'^rgb\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)$', r'rgba(\1,\2,\3,0.5)', 'rgb( 11, 22 , 33 )')
    'rgba(11,22,33,0.5)'

    对 RGB 值的范围没做 0 - 255 的强校验.
    jiutai21
        12
    jiutai21  
       2019-04-09 16:53:11 +08:00
    @coolair 难看点的实现,就是每次调用 evel 时,修改字符串 rgb(r,g,b),把最后的 ) 改为 ,alpha)
    然后 rgb 函数改成 4 个参数
    jiutai21
        13
    jiutai21  
       2019-04-09 17:02:20 +08:00
    找到一个个人认为比较优雅的方法
    def rgb(r, g, b):
    return 'rgba({},{},{},{})'.format(r, g, b, alpha)


    src = 'rgb(54,162,235)'
    di = locals()
    di['alpha']=0.5
    a = eval(src, None,di)
    print(a)
    Mohanson
        14
    Mohanson  
       2019-04-09 17:04:21 +08:00 via Android
    python PIL 模块的 Color 子模块有你想要的
    Mohanson
        15
    Mohanson  
       2019-04-09 17:10:00 +08:00 via Android
    名字错了,是 ImageColor.py
    ETiV
        16
    ETiV  
       2019-04-09 17:57:43 +08:00
    思路是忽略大小写的匹配 rgb(括号里的全部内容)
    替换为 rgba(括号里的全部内容, 0.5)

    echo 'Rgb(54, 162, 235)' | sed -E 's;rgb\((.*)\);rgba(\1, 0.5);gi'

    不会 Python
    ETiV
        17
    ETiV  
       2019-04-09 17:59:11 +08:00
    sed -E 's;rgb\(([^)]+)\);rgba(\1, 0.5);gi'

    rgb(排除掉)的全部内容)
    ysc3839
        18
    ysc3839  
       2019-04-09 18:18:26 +08:00 via Android
    先把字符串转成小写,再把 ')' 替换成 ', 0.5)'。
    ysc3839
        19
    ysc3839  
       2019-04-09 18:19:03 +08:00 via Android
    @ysc3839 忘了,还要把 'rgb' 替换成 'rgba'。
    ryan18
        20
    ryan18  
       2019-04-09 18:19:44 +08:00 via Android
    既然用大蛇,为什么不去找轮子
    touxigua
        21
    touxigua  
       2019-04-10 18:12:02 +08:00
    @Mohanson 老哥在吗~ 关于盲水印
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4944 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:18 · PVG 09:18 · LAX 17:18 · JFK 20:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.