Python 用于替换列表中特殊模式的正则表达式

Python 用于替换列表中特殊模式的正则表达式,python,regex,python-3.x,regex-lookarounds,Python,Regex,Python 3.x,Regex Lookarounds,我一直在编写一个python脚本来推特一些关于我的pihole的信息,但遇到了一个小问题。我似乎无法让re.sub像我希望的那样为我工作 我试图完成的是获取netifaces.interfaces()的输出,对我来说,它是['lo',ens4',tun0',tun1']并使它看起来像ens4,tun0,tun1 我试过使用 netfaces = str(netifaces.interfaces()) netfaces = re.sub('\[|\'|lo|\'|\]', '', netfaces

我一直在编写一个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 
编辑:

谢谢第四只鸟

我对他们提供的正则表达式进行了扩展,得出了这个结论

“lo”(?:,\s*)?[][”)(]。(?:,\s*)?“lo”

我的看法:

'lo'(?:,\s*)?
-搜索字符串以查找
'lo',
,并删除所有已找到的内容

[][”)(]
-删除所有
][
)(无论找到什么

(?:,\s*)?“lo”
-删除所有
,“lo”
,无论找到什么


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

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

^[^,]+,\s*|'|\]
并用空字符串删除它,以获得所需的字符串

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

作为一种替代方法,我假设您最初在列表中有您的元素,您最好使用这种方法,它不依赖正则表达式来获得您想要的输出

arr = ['lo', 'ens4', 'tun0', 'tun1']
arr.remove('lo')
print(', '.join(arr))
打印您的预期输出

ens4, tun0, tun1

得到该结果的原因是,您正在匹配4个可选项,您也可以将它们写为
[]][']|lo
,但您没有匹配逗号及其后的空格,因此不会删除它们

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

'lo'(?:,\s*)?|[][']
  • “lo”(?:,\s*)?
    匹配lo,后跟可选部分以匹配逗号和1+空格字符
  • |
  • [][']
    匹配字符类
    [
    ]
    中列出的任何字符
替换为空字符串

|

比如说

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

谢谢!!我可能还没弄明白。@mwoolweaver:我添加了另一个解决方案,但没有使用正则表达式,因为我相信您的字符串最初确实是一个列表。您也可以尝试使用这种方法。我得到的结果是从
netifaces
模块返回的,这是“最简单的”获取网络事件列表的方法?我假设它返回一个列表,因为我无法使用regex操作它的输出。如果您愿意,可以在github上查看整个脚本->@mwoolweaver:是的,确实
netifaces.interfaces()
返回了一个列表,因此使用我的第二种方法更好,因为这样无论其在数组中的位置如何,
lo
都将被删除。很高兴我能提供帮助,并感谢您接受我的答案。在经过一些测试后,最终使用了您的修改版本“lo”
将捕捉到
,“lo”
现在作为更好的解释出现在OP的底部。