【问题标题】:RegEx for replacing special patterns in a listRegEx 用于替换列表中的特殊模式
【发布时间】:2019-10-02 20:08:00
【问题描述】:

我一直在编写一个 python 脚本来发布一些关于我的 pihole 的信息,并且遇到了一个小问题。我似乎无法让re.sub 像我想要的那样为我工作。

我想要完成的是获取netifaces.interfaces() 的输出,对我来说是['lo', 'ens4', 'tun0', 'tun1'] 并使其看起来像ens4, tun0, tun1

我尝试过使用

netfaces = str(netifaces.interfaces())
netfaces = re.sub('\[|\'|lo|\'|\]', '', netfaces)

但它给了我这个输出:

, ens4, tun0, tun1 

编辑:

感谢@the-fourth-bird

我扩展了他们给出的正则表达式并来到了这个

regex test

'lo'(?:,\s*)?|[][')(]|(?:,\s*)?'lo'

我的看法:

'lo'(?:,\s*)? - 在字符串中搜索'lo', 并删除任何发现的内容

[][')(] - 删除所有 ][ ' )( 无论是否找到

(?:,\s*)?'lo' - 删除所有, 'lo',无论是否被发现

这也适用于我得到的os.getloadavg() 输出

【问题讨论】:

    标签: python regex python-3.x regex-lookarounds


    【解决方案1】:

    不清楚为什么你生成了那个看起来像列表的字符串,但你可以使用这个正则表达式,

    ^[^,]+,\s*|'|\]
    

    并用空字符串删除它以获得您想要的字符串。

    由于您只想删除第一个逗号及其之前的所有内容,因此您需要 ^[^,]+,\s* 其余部分还需要使用 ']\] 删除所有引号

    Regex Demo

    作为另一种方法,我假设您最初将元素放在列表中,您应该更喜欢使用这种不依赖正则表达式的方法来获得预期的输出。

    arr = ['lo', 'ens4', 'tun0', 'tun1']
    arr.remove('lo')
    print(', '.join(arr))
    

    打印您的预期输出,

    ens4, tun0, tun1
    

    【讨论】:

    • 谢谢!!我可能从来没有想过。
    • @mwoolweaver:我添加了另一个解决方案而不使用正则表达式,因为我相信您的字符串最初确实是一个列表。您也可以尝试使用该方法。
    • 我得到的是从netifaces 模块返回的,这是获取网络接口列表的“最简单”方法?我假设它返回一个列表,因为我无法使用正则表达式操作它的输出。如果您愿意,可以在 github 上查看整个脚本 -> github.com/mwoolweaver/tweetStats/blob/master/tweetStats.py
    • @mwoolweaver:是的,确实netifaces.interfaces() 返回了一个列表,因此使用我的第二种方法更好,因为lo 将被删除,无论其在数组中的位置如何。很高兴我能提供帮助,感谢您接受我的回答。
    【解决方案2】:

    你得到这个结果的原因是你匹配了 4 个替换,你也可以写成[][']|lo,但是你没有匹配逗号和它后面的空格,所以不会被删除。

    如果您想从列表中删除 'lo' 而不在开头留下逗号和空格,您可以使用:

    'lo'(?:,\s*)?|[][']
    
    • 'lo'(?:,\s*)? 匹配 lo 后跟可选部分以匹配逗号和 1+ 个空格字符
    • |或者
    • []['] 匹配字符类[]' 中列出的任何一个

    用空字符串替换。

    Regex demo | Python demo

    例如

    import re
    regex = r"'lo'(?:,\s*)?|[][']"
    test_str = "['lo', 'ens4', 'tun0', 'tun1']"
    result = re.sub(regex, "", test_str)
    
    if result:
        print (result)
    

    结果

    ens4, tun0, tun1
    

    【讨论】:

    • 在经过一些测试之后,实际上最终还是使用了你的修改版本 'lo'(?:,\s*)?|[][']|(?:,\s*)?'lo' regex demo 现在也会赶上 , 'lo'
    • 更好的解释@OP的底部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    相关资源
    最近更新 更多