Python 用于替换列表中特殊模式的正则表达式
我一直在编写一个python脚本来推特一些关于我的pihole的信息,但遇到了一个小问题。我似乎无法让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
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,后跟可选部分以匹配逗号和1+空格字符“lo”(?:,\s*)?
或|
匹配字符类[][']
,[
,]
中列出的任何字符
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的底部。